golang高性能NoSQL数据库插件库ledisdb的使用
Golang高性能NoSQL数据库插件库LedisDB的使用
LedisDB简介
LedisDB是一个用Go编写的高性能NoSQL数据库库和服务器。它类似于Redis,但将数据存储在磁盘上。它支持多种数据结构,包括kv、list、hash、zset和set。
主要特性
- 丰富的数据结构:KV、List、Hash、ZSet、Set
- 数据存储不受RAM限制
- 支持多种后端:LevelDB、goleveldb、RocksDB、RAM
- 支持Lua脚本
- 支持过期和TTL
- 可以通过redis-cli管理
- 易于嵌入到您自己的Go应用程序中
- 支持HTTP API,JSON/BSON/msgpack输出
- 复制功能保证数据安全
- 提供加载、转储和修复数据库的工具
- 支持集群
- 认证支持
安装与使用
从源码构建
git clone git@github.com:ledisdb/ledisdb.git
cd ledisdb
# 设置构建和运行环境
source dev.sh
make
make test
构建完成后,所有二进制文件将位于./bin
目录中。
LevelDB支持
- 安装leveldb和snappy:
sudo sh tools/build_leveldb.sh
- 在
dev.sh
中设置LEVELDB_DIR
和SNAPPY_DIR
为实际安装路径 - 重新构建:
make clean && make
RocksDB支持
- 安装rocksdb(5.1+)和snappy
- 在
dev.sh
中设置ROCKSDB_DIR
和SNAPPY_DIR
为实际安装路径 - 重新构建:
make clean && make
选择存储数据库
LedisDB现在支持goleveldb、leveldb、rocksdb和RAM,默认使用goleveldb。
选择存储数据库非常简单:
- 在服务器配置文件中设置:
db_name = "leveldb"
- 通过命令行标志设置:
ledis -config=/etc/ledis.conf -db_name=leveldb
命令行标志设置会覆盖配置文件设置。
示例代码
服务器示例
// 设置运行环境(如果尚未设置)
source dev.sh
./bin/ledis -config=/etc/ledis.conf
// 另一个shell
./bin/ledis cli -p 6380
ledis 127.0.0.1:6380> set a 1
OK
ledis 127.0.0.1:6380> get a
"1"
// 使用curl
curl http://127.0.0.1:11181/SET/hello/world
→ {"SET":[true,"OK"]}
curl http://127.0.0.1:11181/0/GET/hello?type=json
→ {"GET":"world"}
包使用示例
import (
lediscfg "github.com/ledisdb/ledisdb/config"
"github.com/ledisdb/ledisdb/ledis"
)
// 使用Ledis的默认配置
cfg := lediscfg.NewConfigDefault()
l, _ := ledis.Open(cfg)
db, _ := l.Select(0)
db.Set(key, value)
db.Get(key)
复制示例
ledis cli -p 6381
ledis 127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
注意事项
- 在运行时更改后端数据库非常危险。如果这样做,不能保证数据验证。
- Go版本要求 >= 1.11
集群支持
LedisDB使用名为xcodis的代理来支持集群。
性能
有关性能基准测试的详细信息,请参考项目wiki中的benchmark部分。
更多关于golang高性能NoSQL数据库插件库ledisdb的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang高性能NoSQL数据库插件库ledisdb的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
LedisDB - Golang高性能NoSQL数据库插件库使用指南
什么是LedisDB
LedisDB是一个用Go编写的高性能NoSQL数据库,它提供了类似Redis的API但底层使用LevelDB/RocksDB等存储引擎,具有以下特点:
- 支持丰富的数据结构:String, Hash, List, Set, Sorted Set
- 高性能:基于高效的存储引擎
- 低内存占用:相比Redis内存需求更低
- 持久化:数据自动持久化到磁盘
- 嵌入式:可作为库直接集成到应用中
安装
go get github.com/ledisdb/ledisdb
基本使用示例
1. 初始化数据库
package main
import (
"fmt"
"github.com/ledisdb/ledisdb/config"
"github.com/ledisdb/ledisdb/ledis"
)
func main() {
// 配置数据库
cfg := config.NewConfigDefault()
cfg.DataDir = "/tmp/ledisdb_data" // 设置数据存储目录
// 打开数据库
db, err := ledis.Open(cfg)
if err != nil {
panic(err)
}
defer db.Close()
// 选择数据库(类似Redis的select命令)
ledisDB, err := db.Select(0)
if err != nil {
panic(err)
}
// 下面可以使用ledisDB进行操作...
}
2. 字符串操作
// 设置键值
err = ledisDB.Set([]byte("name"), []byte("LedisDB"))
if err != nil {
panic(err)
}
// 获取值
value, err := ledisDB.Get([]byte("name"))
if err != nil {
panic(err)
}
fmt.Printf("Got value: %s\n", string(value))
// 删除键
_, err = ledisDB.Del([]byte("name"))
if err != nil {
panic(err)
}
3. Hash操作
// 设置Hash字段
err = ledisDB.HSet([]byte("user:1"), []byte("name"), []byte("Alice"))
if err != nil {
panic(err)
}
// 获取Hash字段
name, err := ledisDB.HGet([]byte("user:1"), []byte("name"))
if err != nil {
panic(err)
}
fmt.Printf("User name: %s\n", string(name))
// 获取所有Hash字段
allFields, err := ledisDB.HGetAll([]byte("user:1"))
if err != nil {
panic(err)
}
for k, v := range allFields {
fmt.Printf("%s: %s\n", string(k), string(v))
}
4. List操作
// 从左侧推入元素
_, err = ledisDB.LPush([]byte("mylist"), []byte("item1"), []byte("item2"))
if err != nil {
panic(err)
}
// 获取列表长度
length, err := ledisDB.LLen([]byte("mylist"))
if err != nil {
panic(err)
}
fmt.Printf("List length: %d\n", length)
// 从左侧弹出元素
item, err := ledisDB.LPop([]byte("mylist"))
if err != nil {
panic(err)
}
fmt.Printf("Popped item: %s\n", string(item))
高级特性
批量操作
batch := ledisDB.NewBatch()
defer batch.Close()
batch.Put([]byte("key1"), []byte("value1"))
batch.Put([]byte("key2"), []byte("value2"))
batch.Delete([]byte("key3"))
err = batch.Commit()
if err != nil {
panic(err)
}
事务支持
txn, err := ledisDB.Begin()
if err != nil {
panic(err)
}
err = txn.Set([]byte("tx_key"), []byte("tx_value"))
if err != nil {
txn.Rollback()
panic(err)
}
err = txn.Commit()
if err != nil {
panic(err)
}
迭代器
iter, err := ledisDB.RangeIterator([]byte("a"), []byte("z"), store.RangeClose)
if err != nil {
panic(err)
}
defer iter.Close()
for iter.Valid() {
key := iter.Key()
value := iter.Value()
fmt.Printf("%s: %s\n", string(key), string(value))
iter.Next()
}
性能优化建议
- 批量操作:尽量使用批量操作而不是单条操作
- 合理配置:根据硬件调整配置参数(缓存大小等)
- 避免大value:将大value拆分为多个小value
- 使用合适的数据结构:根据场景选择最合适的数据类型
适用场景
LedisDB适合以下场景:
- 需要嵌入式NoSQL解决方案
- 需要比Redis更低的内存占用
- 需要持久化保证
- Go语言项目中需要高性能本地存储
总结
LedisDB为Go开发者提供了一个高性能、低内存占用的嵌入式NoSQL解决方案,API设计类似Redis,学习成本低。它特别适合需要本地持久化存储的中小型应用场景。