Redka 是一個基于 SQLite 實現的 Redis 替代產品,實現了 Redis 的核心功能,并且完全兼容 Redis API。它可以用于輕量級緩存、嵌入式系統、快速原型開發以及需要事務 ACID 特性的鍵值操作等場景。
功能特性
Redka 的主要特點包括:
- 使用 SQLite 作為存儲,數據大小不必受到內存大小限制。
- 支持 ACID 事務,支持原子性操作和復雜事務。
- 提供 SQL 視圖,方便數據訪問和查詢。
- 支持進程內(Go API)運行和獨立服務器部署(RESP)。
- 兼容 Redis 命令和通信協議。
Redka 目前已經實現了以下五種 Redis 數據類型:
- 字符串(Strings),這是最基本的 Redis 類型,表示一個字節序列。
- 列表(Lists),按插入順序排序的字符串序列。
- 集合(Sets),唯一字符串的無序集合。
- 哈希(Hashes),字段-值的(哈希)映射。
- 有序集合(Sorted Sets),按照每個字符串的關聯分數排序的唯一字符串集合。
除此之外,Redka 還提供了鍵管理、服務器/連接管理以及事務命令。
安裝使用
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 6379127.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/redkago get github.com/mattn/go-sqlite3
然后就可以在 Go 程序中創建數據庫:
// A basic example of using Redka
// with github.com/mattn/go-sqlite3 driver.
package mainimport ("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>
性能測試
Redka 作者在一臺 Macbook Air 筆記本中使用 redis-benchmark 工具比較了 兩者的性能,結果顯示 Redka 相比 Redis 慢了 2 - 5 倍,考慮到前者使用關系型數據庫作為存儲,這個結果在意料之中。即便如此,測試中的 Redka 寫入性能達到了 26000/s,讀取性能達到了 100000/s,已經可以滿足大多數應用程序了。
具體測試方法和硬件配置可以參考下面這篇文檔:
https://github.com/nalgeon/redka/blob/main/docs/performance.md