https://github.com/tsmask/redka
Redis用SQL重新实现,与Redis API保持兼容
https://github.com/tsmask/redka
key-value mysql postgres rdb-proxy redis-server sqlite
Last synced: 2 months ago
JSON representation
Redis用SQL重新实现,与Redis API保持兼容
- Host: GitHub
- URL: https://github.com/tsmask/redka
- Owner: TsMask
- License: bsd-3-clause
- Created: 2026-03-30T08:23:56.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-10T02:10:02.000Z (3 months ago)
- Last Synced: 2026-04-10T04:12:03.221Z (3 months ago)
- Topics: key-value, mysql, postgres, rdb-proxy, redis-server, sqlite
- Language: Go
- Homepage:
- Size: 147 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Redka

> 本项目基于 [fork nalgeon/redka](https://github.com/nalgeon/redka) 二次开发
Redka 是一个用 Go 语言实现的 Redis 兼容服务器,使用关系型数据库作为后端存储,同时保持与 Redis API 的完全兼容。
## 特性
- **多后端支持**: 支持 SQLite、PostgreSQL、MySQL 作为后端存储
- **内存高效**: 数据无需全部加载到内存,支持持久化存储
- **ACID 事务**: 提供完整的事务支持,确保数据一致性
- **SQL 视图**: 提供 SQL 视图便于数据分析和报表生成
- **灵活部署**: 可嵌入 Go 应用使用,或作为独立服务器运行
- **Redis 兼容**: 完整实现 Redis 命令和 RESP 通信协议
- **认证支持**: 支持密码认证,保障服务安全
- **配置管理**: 支持 YAML 配置文件和命令行参数
- **日志系统**: 提供结构化日志,支持文件输出和详细日志模式
- **Unix Socket**: 支持 Unix Domain Socket 连接
## 支持的数据类型
Redka 支持 Redis 五种核心数据类型:
- **字符串 (String)** - 最基础的 Redis 类型,表示字节序列
- **列表 (List)** - 按插入顺序排序的字符串序列
- **集合 (Set)** - 无序且唯一的字符串集合
- **哈希 (Hash)** - 键值对映射
- **有序集合 (Sorted Set)** - 按关联分数排序的唯一字符串集合
Redka 还提供键管理、服务器/连接管理命令。
## 配置
Redka 支持命令行参数和 YAML 配置文件。
```bash
# 使用内存数据库启动(默认端口 6379)
./redka
# 使用配置文件启动
./redka -c config.example.yaml
# 使用文件数据库启动
./redka -p 6380 redka.db
# 使用 Unix Socket
./redka -s /tmp/redka.sock redka.db
```
### 命令行参数
```bash
./redka [-h host] [-p port] [-s unix-socket] [-a password] [-c config-file] [-v] [db-dsn]
```
| 参数 | 说明 | 默认值 |
|------|------|--------|
| `-h` | 监听地址 | `0.0.0.0` |
| `-p` | 监听端口 | `6379` |
| `-s` | Unix socket 路径(覆盖 host 和 port) | 无 |
| `-a` | 认证密码 | 无 |
| `-c` | 配置文件路径(会被命令行参数覆盖) | 无 [配置文件示例](./scripts/redka.yaml) |
| `-v` | 启用详细日志和性能分析端点 | `false` |
| `db-dsn` | 数据库连接字符串 | `file:/tmp/redka.sqlite?vfs=memdb` |
### DSN 格式说明
| 数据库类型 | DSN 示例 |
|------------|----------|
| SQLite | `file:redka.db` 或 `sqlite:/path/to/db` 或直接文件路径 |
| PostgreSQL | `postgres://user:password@localhost:5432/dbname` |
| MySQL | `mysql://user:password@tcp(localhost:3306)/dbname` |
## 数据库后端
Redka 使用 GORM 作为 ORM,支持三种关系型数据库后端:
- **SQLite**: 轻量级,进程内存储,适合开发和测试
- **PostgreSQL**: 功能强大的开源数据库,适合生产环境
- **MySQL**: 广泛使用的关系型数据库,支持 MariaDB
## 性能
Redka 不追求极致性能。使用 SQLite 这种通用关系型后端无法击败 Redis 这种专用数据存储。但 Redka 仍能处理每秒数万次操作,对许多应用来说足够了。
## 技术栈
- **语言**: Go 1.25+
- **协议**: RESP (Redis Serialization Protocol)
- **网络**: 基于 [Redcon](https://github.com/tidwall/redcon) 库实现
- **ORM**: [GORM](https://gorm.io/)
- **数据库驱动**: SQLite3, PostgreSQL, MySQL
## 项目结构
```text
redka/
├── main.go # 服务入口
├── server/ # 服务器实现
├── internal/ # 内部核心模块
│ ├── core/ # 核心类型定义
│ ├── store/ # 数据库存储层
│ ├── rstring/ # 字符串操作
│ ├── rlist/ # 列表操作
│ ├── rset/ # 集合操作
│ ├── rzset/ # 有序集合操作
│ └── rhash/ # 哈希操作
├── config/ # 配置管理
├── scripts/ # 脚本和配置示例
└── README.md # 本文件
```
## 测试
```bash
# 运行功能测试脚本(需先启动服务)
./test-redis-cli.sh [port] [host] [password]
# 示例
./test-redis-cli.sh 6380 127.0.0.1 password
```
测试脚本会自动检测 command.go 中支持的全部命令,确保测试覆盖完整。
## 打包
```bash
# 打包 Deb 包
./scripts/build-deb.sh
# 打包 RPM 包
./scripts/build-rpm.sh
# 普通二进制
make build
```
## 贡献
欢迎贡献代码,请先开 issue 讨论你想做的更改。
欢迎使用AI工具诊断该项目,并添加或更新功能测试。
## 致谢
Redka 的实现离不开这些优秀项目及其创建者:
- [Redis](https://redis.io/) ([Salvatore Sanfilippo](https://github.com/antirez)) - 提供超越 get-set 范式的数据结构便捷 API
- [SQLite](https://sqlite.org/) ([D. Richard Hipp](https://www.sqlite.org/crew.html)) - 驱动世界的进程内数据库
- [Redcon](https://github.com/tidwall/redcon) ([Josh Baker](https://github.com/tidwall)) - 简洁易用的 RESP 服务器实现
- [GORM](https://gorm.io/) - Go 语言的 ORM 库
- [Fork nalgeon/redka](https://github.com/nalgeon/redka) - Redka用SQL重新实现,与Redis API保持兼容
Logo 字体由 [Ek Type](https://ektype.in/) 提供。