SQLite + Redis = Redka

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 版本:

bash 复制代码
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 文件运行服务,语法如下:

bash 复制代码
redka [-h host] [-p port] [-s unix-socket] [db-path]

例如:

bash 复制代码
./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:

bash 复制代码
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 驱动:

bash 复制代码
go get github.com/nalgeon/redka

go get github.com/mattn/go-sqlite3

然后就可以在 Go 程序中创建数据库:

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)
}

以上程序的输出结果:

bash 复制代码
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

相关推荐
呆呆小金人1 小时前
SQL视图:虚拟表的完整指南
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
笨手笨脚の1 小时前
Mysql 读书笔记
数据库·mysql·事务·索引·orderby·自增主键
码力引擎1 小时前
【零基础学MySQL】第四章:DDL详解
数据库·mysql·1024程序员节
程序新视界1 小时前
MySQL的隔离级别及其工作原理详解
数据库·后端·mysql
liliangcsdn1 小时前
如何基于llm+mysql构建轻量级全文搜索
数据库·人工智能·mysql
李慕婉学姐1 小时前
Springboot微信小程序在线考试系统w47h61gy(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·微信小程序
啊吧怪不啊吧1 小时前
SQL之表的查改(下)
大数据·数据库·sql
工具人55552 小时前
adb disable-verity
数据库·数据仓库·adb
白露与泡影3 小时前
Redis:我是如何与客户端进行通信的
数据库·redis·缓存
一只小bit7 小时前
MySQL 索引:从聚簇到普通索引,如何加快查询效率?
数据库·mysql·oracle