Redis与SQLite-Redka


Redka 是一个基于 SQLite 实现的 Redis 替代产品,实现了 Redis 的核心功能,并且完全兼容 Redis API。它可以用于轻量级缓存、嵌入式系统、快速原型开发以及需要事务 ACID 特性的键值操作等场景。采用Go语言编写开发并在BSD三娄协议授权。

Redka aims to reimplement the core parts of Redis with SQLite, while remaining compatible with Redis API.
主要特点:
使用 SQLite 作为存储,数据大小不必受到内存大小限制。
支持 ACID 事务,支持原子性操作和复杂事务。
提供 SQL 视图,方便数据访问和查询。
支持进程内(Go API)运行和独立服务器部署(RESP)。
兼容 Redis 命令和通信协议。
目前已经实现了以下5种 Redis 数据类型:
字符串(Strings),这是最基本的 Redis 类型,表示一个字节序列。
列表(Lists),按插入顺序排序的字符串序列。
集合(Sets),唯一字符串的无序集合。
哈希(Hashes),字段-值的(哈希)映射。
有序集合(Sorted Sets),按照每个字符串的关联分数排序的唯一字符串集合。
除此之外,Redka 还提供了键管理、服务器/连接管理以及事务命令。它支持两种部署方式:独立服务器或者进程内 Go 语言模块。
安装使用
Redka 支持两种部署方式:独立服务器或者进程内 Go 语言模块。对于独立服务器部署,可以在发布页面下载并解压,例如 Linux 版本:
curl -L -O "https://github.com/nalgeon/redka/releases/download/v0.5.3/redka_linux_amd64.zip"
unzip redka_linux_amd64.zip
chmod +x redka
执行 redka 文件运行服务,语法如下:
redka [-h host] [-p port] [-s unix-socket] [db-path]
例如:
./redka
./redka data.db
./redka -h 0.0.0.0 -p 6379 data.db
./redka -s /tmp/redka.sock data.db
默认主机为 localhost,端口为 6379,数据库路径为空表示使用内存存储;如果指定了 unix 套接字,将会覆盖主机/端口。
启动服务之后可以使用任何 Redis 客户端工具或者驱动进行连接,例如 redis-cli:
redis-cli -h localhost -p 6379
127.0.0.1:6379> echo hello
"hello"
127.0.0.1:6379> set name alice
OK
127.0.0.1:6379> get name
"alice"
如果使用 Go 语言,可以直接使用 redka 模块在进程中运行。首先安装模块和 SQLite 驱动:
go get github.com/nalgeon/redka
go get github.com/mattn/go-sqlite3
然后就可以在 Go 程序中创建数据库:
// A basic example of using Redka
// with github.com/mattn/go-sqlite3 driver.
package main
import(
"log"
"log/slog"
_"github.com/mattn/go-sqlite3"
"github.com/nalgeon/redka"
)
func main(){
// Open a database.
db, err := redka.Open("data.db",nil)
if err !=nil{
log.Fatal(err)
}
defer db.Close()
// Set some string keys.
err = db.Str().Set("name","alice")
slog.Info("set","err", err)
err = db.Str().Set("age",25)
slog.Info("set","err", err)
// Check if the keys exist.
count, err := db.Key().Count("name","age","city")
slog.Info("count","count", count,"err", err)
// Get a key.
name, err := db.Str().Get("name")
slog.Info("get","name", name,"err", err)
}
以上程序的输出结果:
count count=2 err=<nil>
get name="alice" err=<nil>
性能测试
其作者在一台 Macbook Air 笔记本中使用 redis-benchmark 工具比较了 两者的性能,结果显示 Redka 相比 Redis 慢了 2 - 5 倍,考虑到前者使用关系型数据库作为存储,这个结果在意料之中。即便如此,测试中的 Redka 写入性能达到了 26000/s,读取性能达到了 100000/s,已经可以满足大多数应用程序了。具体测试方法和硬件配置可以参考此处。
最新版本:0.5
v0.5.3于2024年12月发布。
项目主页:https://github.com/nalgeon/redka/
Redka aims to reimplement the core parts of Redis with SQLite, while remaining compatible with Redis API.
主要特点:
使用 SQLite 作为存储,数据大小不必受到内存大小限制。
支持 ACID 事务,支持原子性操作和复杂事务。
提供 SQL 视图,方便数据访问和查询。
支持进程内(Go API)运行和独立服务器部署(RESP)。
兼容 Redis 命令和通信协议。
目前已经实现了以下5种 Redis 数据类型:
字符串(Strings),这是最基本的 Redis 类型,表示一个字节序列。
列表(Lists),按插入顺序排序的字符串序列。
集合(Sets),唯一字符串的无序集合。
哈希(Hashes),字段-值的(哈希)映射。
有序集合(Sorted Sets),按照每个字符串的关联分数排序的唯一字符串集合。
除此之外,Redka 还提供了键管理、服务器/连接管理以及事务命令。它支持两种部署方式:独立服务器或者进程内 Go 语言模块。
安装使用
Redka 支持两种部署方式:独立服务器或者进程内 Go 语言模块。对于独立服务器部署,可以在发布页面下载并解压,例如 Linux 版本:
curl -L -O "https://github.com/nalgeon/redka/releases/download/v0.5.3/redka_linux_amd64.zip"
unzip redka_linux_amd64.zip
chmod +x redka
执行 redka 文件运行服务,语法如下:
redka [-h host] [-p port] [-s unix-socket] [db-path]
例如:
./redka
./redka data.db
./redka -h 0.0.0.0 -p 6379 data.db
./redka -s /tmp/redka.sock data.db
默认主机为 localhost,端口为 6379,数据库路径为空表示使用内存存储;如果指定了 unix 套接字,将会覆盖主机/端口。
启动服务之后可以使用任何 Redis 客户端工具或者驱动进行连接,例如 redis-cli:
redis-cli -h localhost -p 6379
127.0.0.1:6379> echo hello
"hello"
127.0.0.1:6379> set name alice
OK
127.0.0.1:6379> get name
"alice"
如果使用 Go 语言,可以直接使用 redka 模块在进程中运行。首先安装模块和 SQLite 驱动:
go get github.com/nalgeon/redka
go get github.com/mattn/go-sqlite3
然后就可以在 Go 程序中创建数据库:
// A basic example of using Redka
// with github.com/mattn/go-sqlite3 driver.
package main
import(
"log"
"log/slog"
_"github.com/mattn/go-sqlite3"
"github.com/nalgeon/redka"
)
func main(){
// Open a database.
db, err := redka.Open("data.db",nil)
if err !=nil{
log.Fatal(err)
}
defer db.Close()
// Set some string keys.
err = db.Str().Set("name","alice")
slog.Info("set","err", err)
err = db.Str().Set("age",25)
slog.Info("set","err", err)
// Check if the keys exist.
count, err := db.Key().Count("name","age","city")
slog.Info("count","count", count,"err", err)
// Get a key.
name, err := db.Str().Get("name")
slog.Info("get","name", name,"err", err)
}
以上程序的输出结果:
count count=2 err=<nil>
get name="alice" err=<nil>
性能测试
其作者在一台 Macbook Air 笔记本中使用 redis-benchmark 工具比较了 两者的性能,结果显示 Redka 相比 Redis 慢了 2 - 5 倍,考虑到前者使用关系型数据库作为存储,这个结果在意料之中。即便如此,测试中的 Redka 写入性能达到了 26000/s,读取性能达到了 100000/s,已经可以满足大多数应用程序了。具体测试方法和硬件配置可以参考此处。
最新版本:0.5
v0.5.3于2024年12月发布。
项目主页:https://github.com/nalgeon/redka/