在现代应用开发中,Redis 以其高性能和丰富的数据结构成为缓存和实时数据处理的首选。然而,Redis 将所有数据存储在内存中,这在某些场景下可能带来成本和持久化方面的挑战。今天要介绍的 Redka 项目,正是为了解决这一痛点而生——它是一个完全兼容 Redis API 的存储解决方案,但后端使用的是关系型数据库!
什么是 Redka?
Redka 是一个用 Go 语言实现的 Redis 兼容服务器,它使用 SQLite、PostgreSQL 或 MySQL 等关系型数据库作为后端存储,同时保持与 Redis API 的完全兼容。这意味着你可以像使用 Redis 一样使用 Redka,但数据实际上是持久化存储在关系型数据库中的。
Redka 基于 nalgeon/redka 二次开发,在原有功能基础上进行了增强和优化。
核心特性
1. 多后端支持
Redka 支持三种主流的关系型数据库作为后端存储:
- SQLite:轻量级,进程内存储,适合开发和测试环境
- PostgreSQL:功能强大的开源数据库,适合生产环境
- MySQL:广泛使用的关系型数据库,也支持 MariaDB
2. 内存高效
与 Redis 不同,Redka 不需要将所有数据加载到内存中。数据直接存储在关系型数据库中,大大降低了内存占用,特别适合数据量大但访问频率不高的场景。
3. ACID 事务支持
借助关系型数据库的事务特性,Redka 提供完整的 ACID 事务支持,确保数据的一致性和可靠性。
4. SQL 视图支持
由于数据实际存储在关系型数据库中,你可以直接通过 SQL 查询来分析数据或生成报表,这是传统 Redis 无法做到的。
5. 完全 Redis 兼容
Redka 实现了 Redis 的五种核心数据类型:
- 字符串 (String)
- 列表 (List)
- 集合 (Set)
- 哈希 (Hash)
- 有序集合 (Sorted Set)
同时还支持 Redis 的 RESP (Redis Serialization Protocol) 通信协议,现有的 Redis 客户端无需任何修改即可直接连接 Redka。
技术架构
Redka 的技术栈非常现代化:
- 语言: Go 1.25+
- 协议: RESP (Redis Serialization Protocol)
- 网络: 基于 Redcon 库实现
- ORM: GORM
- 数据库驱动: SQLite3, PostgreSQL, MySQL
项目结构清晰,模块化设计:
redka/
├── redka.go # 库入口(可作为库引用)
├── cmd/redka/main.go # 服务入口
├── server/ # 服务器实现
├── internal/ # 内部核心模块
│ ├── core/ # 核心类型定义
│ ├── store/ # 数据库存储层
│ ├── rstring/ # 字符串操作
│ ├── rlist/ # 列表操作
│ ├── rset/ # 集合操作
│ ├── rzset/ # 有序集合操作
│ └── rhash/ # 哈希操作
快速开始
作为独立服务运行
# 使用内存数据库启动(默认端口 6379)
./redka
# 使用配置文件启动
./redka -c config.example.yaml
# 使用文件数据库启动
./redka -p 6380 redka.db
# 使用 Unix Socket
./redka -s /tmp/redka.sock redka.db
作为嵌入式库使用
Redka 也可以作为 Go 库嵌入到你的应用中:
import "github.com/tsmask/redka"
func main() {
// 携程启动
ready, srv := redka.StartAsync(":6379", "sqlite://test.db")
if err := <-ready; err != nil {
panic(err)
}
// 等待 shutdown 信号
srv.WaitForShutdown()
}
配置选项
Redka 支持灵活的配置方式,既可以通过命令行参数,也可以使用 YAML 配置文件:
| 参数 | 说明 | 默认值 |
|---|---|---|
| -h | 监听地址 | 0.0.0.0 |
| -p | 监听端口 | 6379 |
| -s | Unix socket 路径 | 无 |
| -a | 认证密码 | 无 |
| -c | 配置文件路径 | 无 |
| -v | 启用详细日志 | false |
适用场景
Redka 特别适合以下场景:
- 开发和测试环境:使用 SQLite 作为后端,无需额外部署 Redis 服务
- 数据持久化要求高:关系型数据库的持久化特性比 Redis 更可靠
- 需要 SQL 分析能力:可以直接对 Redis 数据进行 SQL 查询和分析
- 内存资源受限:不需要将所有数据加载到内存中
- 现有系统集成:已有关系型数据库基础设施,希望复用现有资源
性能考量
需要注意的是,Redka 并不追求极致性能。使用通用关系型数据库作为后端,性能自然无法与专门优化的 Redis 相比。但根据项目文档,Redka 仍能处理每秒数万次操作,对于许多应用场景来说已经足够。
总结
Redka 为 Redis 生态提供了一个有趣的替代方案。它在保持 Redis API 兼容性的同时,利用关系型数据库的优势,解决了内存限制和数据持久化等问题。虽然性能上有所妥协,但在特定场景下,这种权衡是值得的。
如果你正在寻找一个既能享受 Redis 便利性,又需要关系型数据库特性的解决方案,Redka 绝对值得一试!
项目地址: github.com/TsMask/redk…