golang基于LSM+WAL的嵌入式键值数据库插件库rosedb的使用
Golang基于LSM+WAL的嵌入式键值数据库插件库rosedb的使用
什么是RoseDB
RoseDB是一个基于Bitcask存储模型的轻量级、快速且可靠的键值存储引擎。Bitcask的设计部分受到了日志结构化文件系统和日志文件合并的启发。
设计概述
RoseDB日志文件使用WAL(Write Ahead Log)作为后端,这是具有多个块的仅追加文件。
主要特性
优势
- 低延迟读写:由于Bitcask数据库文件的只写、仅追加特性
- 高吞吐量:写入操作通常能饱和I/O和磁盘带宽
- 处理大于RAM的数据集:通过内存索引直接查找磁盘数据位置
- 单次查找检索任何值:内存索引直接指向磁盘数据位置
- 可预测的查找和插入性能
- 快速、有界的崩溃恢复
- 简单备份
- 支持原子性、一致性和持久性的批量操作
- 支持前向和后向迭代器
- 支持键监听
- 支持键过期
局限性
- 键必须适合内存:RoseDB始终将所有键保留在内存中
快速开始
基本操作
package main
import "github.com/rosedblabs/rosedb/v2"
func main() {
// 指定选项
options := rosedb.DefaultOptions
options.DirPath = "/tmp/rosedb_basic"
// 打开数据库
db, err := rosedb.Open(options)
if err != nil {
panic(err)
}
defer func() {
_ = db.Close()
}()
// 设置键
err = db.Put([]byte("name"), []byte("rosedb"))
if err != nil {
panic(err)
}
// 获取键
val, err := db.Get([]byte("name"))
if err != nil {
panic(err)
}
println(string(val))
// 删除键
err = db.Delete([]byte("name"))
if err != nil {
panic(err)
}
}
批量操作
// 创建批量操作
batch := db.NewBatch(rosedb.DefaultBatchOptions)
// 设置键
_ = batch.Put([]byte("name"), []byte("rosedb"))
// 获取键
val, _ := batch.Get([]byte("name"))
println(string(val))
// 删除键
_ = batch.Delete([]byte("name"))
// 提交批量操作
_ = batch.Commit()
社区
欢迎加入Slack频道和讨论区,与RoseDB团队开发人员和其他用户交流。
更多关于golang基于LSM+WAL的嵌入式键值数据库插件库rosedb的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang基于LSM+WAL的嵌入式键值数据库插件库rosedb的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用RoseDB:基于LSM+WAL的Golang嵌入式键值数据库
RoseDB是一个用Go编写的轻量级、高性能的嵌入式键值存储数据库,它结合了LSM树(Log-Structured Merge-Tree)和WAL(Write-Ahead Log)技术,提供了高效的读写性能和持久化能力。
主要特性
- 基于LSM树结构,优化写入性能
- 使用WAL确保数据持久性和崩溃恢复
- 支持多种数据结构:字符串、哈希、列表、集合等
- 内存高效,自动压缩合并数据文件
- 简单易用的API接口
安装
go get github.com/rosedblabs/rosedb/v2
基本使用示例
1. 打开数据库
package main
import (
"fmt"
"github.com/rosedblabs/rosedb/v2"
)
func main() {
// 打开数据库
options := rosedb.DefaultOptions
options.DirPath = "/tmp/rosedb_basic" // 数据库目录
db, err := rosedb.Open(options)
if err != nil {
panic(err)
}
defer db.Close()
// 数据库操作...
}
2. 基本的键值操作
// 写入数据
err = db.Put([]byte("name"), []byte("RoseDB"))
if err != nil {
panic(err)
}
// 读取数据
val, err := db.Get([]byte("name"))
if err != nil {
panic(err)
}
fmt.Printf("name: %s\n", string(val)) // 输出: name: RoseDB
// 删除数据
err = db.Delete([]byte("name"))
if err != nil {
panic(err)
}
3. 批量操作
// 批量写入
batch := db.NewBatch(rosedb.DefaultBatchOptions)
err = batch.Put([]byte("name"), []byte("batch1"))
err = batch.Put([]byte("age"), []byte("25"))
err = batch.Put([]byte("city"), []byte("beijing"))
err = batch.Commit()
if err != nil {
panic(err)
}
// 批量读取
val, _ = db.Get([]byte("name"))
fmt.Println("name:", string(val))
val, _ = db.Get([]byte("age"))
fmt.Println("age:", string(val))
4. 迭代器使用
// 创建迭代器
iter := db.NewIterator(rosedb.DefaultIteratorOptions)
defer iter.Close()
// 遍历所有键值对
for iter.Rewind(); iter.Valid(); iter.Next() {
fmt.Printf("key: %s, value: %s\n", iter.Key(), iter.Value())
}
// 范围查询
for iter.Seek([]byte("a")); iter.Valid(); iter.Next() {
key := iter.Key()
if string(key) > "c" {
break
}
fmt.Printf("key: %s, value: %s\n", key, iter.Value())
}
高级功能
1. 使用TTL(生存时间)
// 设置带TTL的键值
err = db.PutWithTTL([]byte("temp_key"), []byte("temp_value"), 10) // 10秒后过期
if err != nil {
panic(err)
}
2. 使用哈希表
// 哈希表操作
err = db.HSet([]byte("user"), []byte("name"), []byte("Alice"))
err = db.HSet([]byte("user"), []byte("age"), []byte("30"))
// 获取哈希字段
val, err = db.HGet([]byte("user"), []byte("name"))
fmt.Println("user.name:", string(val))
3. 配置选项
options := rosedb.Options{
DirPath: "/tmp/rosedb_advanced", // 数据库目录
SegmentSize: 256 * 1024 * 1024, // 每个数据文件大小256MB
BlockCache: 128 * 1024 * 1024, // 块缓存128MB
MemtableSize: 64 * 1024 * 1024, // memtable大小64MB
BytesPerSync: 0, // 每次写入后不强制同步
KeyOnly: false, // 不只存储key
Sync: false, // 不同步写入磁盘
CompactInterval: time.Hour * 24, // 24小时压缩一次
}
性能优化建议
- 批量写入:尽量使用批量操作而不是单条写入
- 合理配置内存:根据服务器内存情况调整MemtableSize和BlockCache
- 压缩策略:根据写入频率设置合适的CompactInterval
- SSD存储:LSM树在SSD上性能表现更好
- 键设计:使用较短的键名可以提高性能
注意事项
- RoseDB不支持多进程同时访问同一个数据库目录
- 频繁的小写入可能导致频繁的压缩操作,影响性能
- 删除操作不会立即释放磁盘空间,需要等待压缩过程
RoseDB是一个简单高效的嵌入式键值存储解决方案,特别适合需要高性能写入和持久化的场景。通过合理配置和优化,可以满足大多数中小规模应用的存储需求。