微服务十四 Go 使用 leveldb
简介
LevelDB是一个由 Google 公司所研发的键 - 值存储嵌入式数据库管理系统编程库
leveldb 是一个写性能十分优秀的存储引擎,是典型的 LSM 树 (Log Structured-Merge Tree) 实现。LSM 树的核心思想就是放弃部分读的性能,换取最大的写入能力
比较使用读少写多的一种场景. 以太坊、区块链
特点
- key 和 value 都是任意长度的字节数据
- 提供了基本的增删改查接口
- 自动使用 Snappy 压缩数据
- 通过向前或者向后迭代器遍历数据
- 不支持 sql 语句,不支持索引
- 一次只允许一个进程访问一个特定的数据库
安装
由于 leveldb 依赖 Snapy 压缩,所以需要下载 snappy 库
小编基于 goleveldb 封装了一个使用leveldb 的包, 放在了 github 上,需有兴趣可以点击左侧连接下载使用。包括 Put、Get、Has、Delete、SelectAll
在项目中引用
go get github.com/jeffcail/leveldb
使用
1 . 创建 leveldb 连接,会在项目目录下生成一个 level_data 文件夹,用来保存数据
var (
db *leveldb1.LevelDB
err error
)
func init() {db, err = leveldb1.CreateLevelDB("./level_data")
if err != nil {panic(err)
}
}
2. 保存
func main() {save()
}
func save() {
type User struct {
ID int
Name string
Age int
Sex string
}
u := &User{}
u.ID = 1
u.Name = "jeffcail"
u.Age = 18
u.Sex = " 男 "
db.Put("user-1", u)
db.Put("test", " 太阳上的雨天 blog.caixiaoxin.cn")
}
3. 获取条数据
func main() {getUser()
}
func getUser() {user, err := db.Get("user-1")
if err != nil {panic(err)
}
fmt.Printf("user=====%s\n", user)
}
执行结果:
user====={"ID":1,"Name":"jeffcail","Age":18,"Sex":" 男 "}
4. 查询全部
func main() {selectAll()
}
func selectAll() {iter := db.SelectAll()
for iter.Next() {k := iter.Key()
v := iter.Value()
fmt.Printf("k: %s\n", k)
fmt.Printf("v: %s\n", v)
}
iter.Release()
err = iter.Error()
if err != nil {panic(err)
}
}
执行结果:
k: test
v: " 太阳上的雨天 blog.caixiaoxin.cn"
k: user-1
v: {"ID":1,"Name":"jeffcail","Age":18,"Sex":" 男 "}
5. 查询 key 是否存在
func main() {has()
}
func has() {if ok, _ := db.Has("test"); !ok {fmt.Printf("key 为 %s\n 不存在 ", "test")
}
fmt.Printf("key 为 %s\n 存在 ", "test")
}
执行结果:
key 为 test
存在
6. 删除
func main() {del()
}
func del() {err = db.Delete("test")
if err != nil {panic(err)
}
}
正文完