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小时压缩一次
}

性能优化建议

  1. 批量写入:尽量使用批量操作而不是单条写入
  2. 合理配置内存:根据服务器内存情况调整MemtableSize和BlockCache
  3. 压缩策略:根据写入频率设置合适的CompactInterval
  4. SSD存储:LSM树在SSD上性能表现更好
  5. 键设计:使用较短的键名可以提高性能

注意事项

  1. RoseDB不支持多进程同时访问同一个数据库目录
  2. 频繁的小写入可能导致频繁的压缩操作,影响性能
  3. 删除操作不会立即释放磁盘空间,需要等待压缩过程

RoseDB是一个简单高效的嵌入式键值存储解决方案,特别适合需要高性能写入和持久化的场景。通过合理配置和优化,可以满足大多数中小规模应用的存储需求。

回到顶部