github.com/nutsdb/nutsdb@v1.0.4/examples/k-v/get_range/main.go (about)

     1  package main
     2  
     3  import (
     4  	"github.com/nutsdb/nutsdb"
     5  	"io/ioutil"
     6  	"log"
     7  	"os"
     8  )
     9  
    10  var (
    11  	db     *nutsdb.DB
    12  	bucket string
    13  	err    error
    14  )
    15  
    16  func init() {
    17  	fileDir := "/tmp/nutsdb_example"
    18  
    19  	files, _ := ioutil.ReadDir(fileDir)
    20  	for _, f := range files {
    21  		name := f.Name()
    22  		if name != "" {
    23  			err := os.RemoveAll(fileDir + "/" + name)
    24  			if err != nil {
    25  				panic(err)
    26  			}
    27  		}
    28  	}
    29  	db, _ = nutsdb.Open(
    30  		nutsdb.DefaultOptions,
    31  		nutsdb.WithDir(fileDir),
    32  		nutsdb.WithSegmentSize(1024*1024), // 1MB
    33  	)
    34  	if err != nil {
    35  		panic(err)
    36  	}
    37  	bucket = "bucketForString"
    38  
    39  	if err := db.Update(func(tx *nutsdb.Tx) error {
    40  		return tx.NewBucket(nutsdb.DataStructureBTree, bucket)
    41  	}); err != nil {
    42  		log.Fatal(err)
    43  	}
    44  }
    45  
    46  func main() {
    47  	// If we use tx.GetRange on a non-exist key, it will throw an error about key not found
    48  	getRange("non-exist", 0, 0) // key not found
    49  
    50  	put("key", "This is a test value")
    51  	// If we use tx.GetRange with a pair of start and end which start is greater than end, it will throw an error.
    52  	getRange("key", 5, 3) // start is greater than end
    53  	// When start < end but start is greater than the size of value, it will return an empty value.
    54  	getRange("key", 100, 120) // got value: ''
    55  	// When start is less than the size of value, but end is greater. It will use value[start:] as its return.
    56  	getRange("key", 10, 100) // got value: 'test value'
    57  	// When end is less than the size of value. It will use value[start:end+1] as its return. This is same with Redis.
    58  	getRange("key", 10, 13) // got value: 'test'
    59  }
    60  
    61  func put(key, value string) {
    62  	if err := db.Update(func(tx *nutsdb.Tx) error {
    63  		return tx.Put(bucket, []byte(key), []byte(value), nutsdb.Persistent)
    64  	}); err != nil {
    65  		log.Println(err)
    66  	}
    67  }
    68  
    69  func getRange(key string, start, end int) {
    70  	if err := db.View(func(tx *nutsdb.Tx) error {
    71  		value, err := tx.GetRange(bucket, []byte(key), start, end)
    72  		if err != nil {
    73  			return err
    74  		}
    75  		log.Printf("got value: '%s'", string(value))
    76  		return nil
    77  	}); err != nil {
    78  		log.Println(err)
    79  	}
    80  }