Redka:用关系型数据库实现 Redis 兼容存储

3 阅读4分钟

在现代应用开发中,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
-sUnix socket 路径
-a认证密码
-c配置文件路径
-v启用详细日志false

适用场景

Redka 特别适合以下场景:

  1. 开发和测试环境:使用 SQLite 作为后端,无需额外部署 Redis 服务
  2. 数据持久化要求高:关系型数据库的持久化特性比 Redis 更可靠
  3. 需要 SQL 分析能力:可以直接对 Redis 数据进行 SQL 查询和分析
  4. 内存资源受限:不需要将所有数据加载到内存中
  5. 现有系统集成:已有关系型数据库基础设施,希望复用现有资源

性能考量

需要注意的是,Redka 并不追求极致性能。使用通用关系型数据库作为后端,性能自然无法与专门优化的 Redis 相比。但根据项目文档,Redka 仍能处理每秒数万次操作,对于许多应用场景来说已经足够。

总结

Redka 为 Redis 生态提供了一个有趣的替代方案。它在保持 Redis API 兼容性的同时,利用关系型数据库的优势,解决了内存限制和数据持久化等问题。虽然性能上有所妥协,但在特定场景下,这种权衡是值得的。

如果你正在寻找一个既能享受 Redis 便利性,又需要关系型数据库特性的解决方案,Redka 绝对值得一试!

项目地址: github.com/TsMask/redk…