• Go操作nutsdb


    点击链接查看我的个人博客,文章更全更详细

    nutsdb简介

    NutsDB是纯Go语言编写一个简单、高性能、内嵌型、持久化的key-value数据库。

    NutsDB支持事务,从v0.2.0之后的版本开始支持ACID的特性,建议使用最新的release版本。v0.2.0之前的版本,保持高性能,没有作sync,但是具备高性能的写(本地测试,百万数据写入达40~50W+/s)。所有的操作都在事务中执行。NutsDB从v0.2.0版本开始支持多种数据结构,如列表(list)、集合(set)、有序集合(sorted set)。从0.4.0版本开始增加自定义配置读写方式、启动时候的文件载入方式、sync是否开启等

    同一个桶的key不能重复,不同桶中的key 可以重复

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    	defer db.Close()
    
    	key := []byte("go")
    	val := []byte("go1.17")
    
    	db.Update(func(tx *nutsdb.Tx) error {
    		tx.Put("bucket1", key, val, 0)
    		return nil
    	})
    
    	db.Update(func(tx *nutsdb.Tx) error {
    		tx.Put("bucket2", key, val, 0)
    		return nil
    	})
    
    	db.View(func(tx *nutsdb.Tx) error {
    		e, _ := tx.Get("bucket1", key)
    		fmt.Println("key1: ", string(e.Key))
    		fmt.Println("val1: ", string(e.Value))
    		fmt.Println("meta1: ", e.Meta)
    
    		e, _ = tx.Get("bucket2", key)
    		fmt.Println("key2: ", string(e.Key))
    		fmt.Println("val2: ", string(e.Value))
    		fmt.Println("meta2: ", e.Meta)
    		return nil
    	})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    设置过期时间

    Put()支持传入过期时间

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, err := nutsdb.Open(opt)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer db.Close()
    
    	key := []byte("go")
    	val := []byte("go-value")
    	db.Update(func(tx *nutsdb.Tx) error {
    		tx.Put("", key, val, 10)
    		return nil
    	})
    
    	time.Sleep(10 * time.Second)
    
    	db.View(func(tx *nutsdb.Tx) error {
    		e, err := tx.Get("", key)
    		if err != nil {
    			log.Fatal(err)
    		} else {
    			fmt.Println(string(e.Value))
    		}
    		return nil
    	})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    更新和删除

    Put() 值存在就更新,不存在就写入

    func main() {
      opt := nutsdb.DefaultOptions
      opt.Dir = "./nuts_db"
      db, _ := nutsdb.Open(opt)
      defer db.Close()
    
      key := []byte("go")
      val := []byte("go_value")
      db.Update(func(tx *nutsdb.Tx) error {
        tx.Put("", key, val, 0)
        return nil
      })
    
      db.View(func(tx *nutsdb.Tx) error {
        e, _ := tx.Get("", key)
        fmt.Println(string(e.Value))
        return nil
      })
    
      db.Update(func(tx *nutsdb.Tx) error {
        tx.Delete("", key)
        return nil
      })
    
      db.View(func(tx *nutsdb.Tx) error {
        e, err := tx.Get("", key)
        if err != nil {
          log.Fatal(err)
        } else {
          fmt.Println(string(e.Value))
        }
        return nil
      })
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    遍历

    键是以字节顺序保存的。

    前缀遍历

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    	defer db.Close()
    
    	bucket := "order_list"
    	prefix := "order_"
    	db.Update(func(tx *nutsdb.Tx) error {
    		for i := 0; i < 1000; i++ {
    			key := []byte(prefix + strconv.FormatInt(int64(i), 10))
    			value := []byte("go" + strconv.FormatInt(int64(i), 10))
    			tx.Put(bucket, key, value, 0)
    		}
    		return nil
    	})
    
    	db.View(func(tx *nutsdb.Tx) error {
    		entries, _, _ := tx.PrefixScan(bucket, []byte(prefix), 25, 900)
    		for _, entry := range entries {
    			fmt.Println(string(entry.Key), string(entry.Value))
    		}
    		return nil
    	})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    范围遍历

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    	defer db.Close()
    
    	bucket := "order_list"
    	prefix := "order_"
    
    	db.View(func(tx *nutsdb.Tx) error {
    		lbound := []byte(prefix + "100")
    		ubound := []byte(prefix + "199")
    		entries, _ := tx.RangeScan(bucket, lbound, ubound)
    		for _, entry := range entries {
    			fmt.Println(string(entry.Key), string(entry.Value))
    		}
    		return nil
    	})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    获取某个桶的全部

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    	defer db.Close()
    
    	bucket := "order_list"
    
    	db.View(func(tx *nutsdb.Tx) error {
    		entries, _ := tx.GetAll(bucket)
    		for _, entry := range entries {
    			fmt.Println(string(entry.Key), string(entry.Value))
    		}
    		return nil
    	})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    列表

    LPush: 从头部插入元素

    LSize: 返回list长度

    LPeek: 返回头部第一个元素

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    	defer db.Close()
    
    	bucket := "order_list"
    	key := []byte("apple")
    
    	db.Update(func(tx *nutsdb.Tx) error {
    		tx.LPush(bucket, key, []byte("apple1"), []byte("apple2"), []byte("apple3"))
    		return nil
    	})
    
    	db.View(func(tx *nutsdb.Tx) error {
    
    		b, _ := tx.LPeek(bucket, key)
    		fmt.Println(string(b))
    
    		l, _ := tx.LSize(bucket, key)
    		fmt.Println(l)
    		return nil
    	})
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    RPush: 从头部插入元素

    RPeek: 返回头部第一哥元素

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    	defer db.Close()
    
    	bucket := "order_list"
    	key := []byte("apple")
    
    	db.Update(func(tx *nutsdb.Tx) error {
    		tx.RPush(bucket, key, []byte("apple1"), []byte("apple2"), []byte("apple3"))
    		return nil
    	})
    
    	db.View(func(tx *nutsdb.Tx) error {
    
    		b, _ := tx.RPeek(bucket, key)
    		fmt.Println(string(b))
    
    		l, _ := tx.LSize(bucket, key)
    		fmt.Println(l)
    		return nil
    	})
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    LPop: 从头部删除一个元素

    RPop: 从尾部删除一个元素

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    	defer db.Close()
    
    	bucket := "order_list"
    	key := []byte("apple")
    
    	db.Update(func(tx *nutsdb.Tx) error {
    		pop, err := tx.LPop(bucket, key)
    		if err != nil {
    			fmt.Println(err)
    		}
    		fmt.Println(string(pop))
    
    		rPop, err := tx.RPop(bucket, key)
    		if err != nil {
    			fmt.Println(err)
    		}
    		fmt.Println(string(rPop))
    
    		return nil
    	})
    
    	db.View(func(tx *nutsdb.Tx) error {
    
    		l, _ := tx.LSize(bucket, key)
    		fmt.Println(l)
    		return nil
    	})
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    备份

    func main() {
    	opt := nutsdb.DefaultOptions
    	opt.Dir = "./nuts_db"
    	db, _ := nutsdb.Open(opt)
    
    	bucket := "order_list"
    	key := []byte("apple")
    
    	db.Backup("./backup")
    	db.Close()
    	opt.Dir = "./backup"
    
    	bdb, _ := nutsdb.Open(opt)
    	bdb.View(func(tx *nutsdb.Tx) error {
    
    		l, err := tx.LSize(bucket, key)
    		if err != nil {
    			fmt.Println("get apple list size err", err)
    		}
    		fmt.Println(l)
    		return nil
    	})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    树莓派4B_OpenCv学习笔记10:调整视频帧大小
    使用Git把项目上传到Gitee的详细步骤
    【数据结构】10道经典面试题目带你玩转链表
    java培训之SpringMVC错误消息的显示及国际化
    Kernel: module接口ABI相关问题分析的思路;__GENKSYMS__;
    Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅 & Redis Lua脚本操作
    create® 3入门教程-ROS2网络配置
    Windows 10外接屏性能挖掘
    LeetCode_279_完全平方数
    cool-admin框架后端使用-node版本,配置多数据源
  • 原文地址:https://blog.csdn.net/weixin_43713498/article/details/126279276