一个从零实现的轻量级Redis服务器,支持多种数据结构、持久化和主从复制。
TinyRedis 是一个教学性质的Redis实现,旨在通过实践理解Redis的核心工作原理。项目使用C++23开发,基于Boost.Asio实现异步网络通信,完整实现了RESP协议和多种Redis命令。
- 字符串 (String) - 基础键值对存储
- 列表 (List) - 有序字符串集合,支持LPUSH/RPUSH等操作
- 哈希 (Hash) - 字段-值对集合
- 集合 (Set) - 唯一字符串集合
- 有序集合 (Sorted Set) - 带分数的有序集合,支持ZADD/ZRANK等
- 流 (Stream) - 日志式数据结构
PING- 服务器心跳检测ECHO- 返回传入的参数SET- 设置键值对,支持EX/PX/NX/XX选项GET- 获取键的值DEL- 删除一个或多个键INCR- 将键的整数值加1TTL/PTTL- 获取键的剩余过期时间
LPUSH/RPUSH- 从左侧/右侧推入元素LPOP/RPOP- 从左侧/右侧弹出元素LRANGE- 获取列表范围内的元素LINDEX- 获取指定索引的元素LSET- 设置指定索引的元素LLEN- 获取列表长度LREM- 移除指定数量的匹配元素LTRIM- 修剪列表到指定范围BLPOP/BRPOP- 阻塞式弹出
HSET/HGET- 设置/获取字段值HGETALL- 获取所有字段和值HDEL- 删除字段HEXISTS- 检查字段是否存在HLEN- 获取字段数量HKEYS- 获取所有字段名HVALS- 获取所有值HINCRBY/HINCRBYFLOAT- 递增字段值
ZADD- 添加成员ZRANK- 获取成员排名ZRANGE/ZREVRANGE- 获取范围内的成员ZRANGEWITHSCORES- 获取带分数的成员ZSCORE- 获取成员分数ZCARD- 获取成员数量ZREM- 删除成员ZCOUNT- 统计分数范围内的成员ZINCRBY- 递增分数ZPOPMIN/ZPOPMAX- 弹出最小/最大分数成员
XADD- 向流添加条目XRANGE- 获取范围内的条目XREAD- 从流读取数据(支持阻塞)
MULTI/EXEC/DISCARD- 事务支持WATCH- 乐观锁支持
REPLCONF- 复制配置PSYNC- 部分同步WAIT- 等待副本确认
INFO- 服务器信息CONFIG- 配置管理SAVE/BGSAVE- RDB持久化KEYS- 键匹配查询TYPE- 键类型查询AUTH- 认证
- ✅ RESP协议 - 完整实现Redis序列化协议
- ✅ 异步网络 - 基于Boost.Asio的高性能异步IO
- ✅ 线程安全 - 线程安全的键值存储
- ✅ 过期机制 - 支持键过期和智能清理
- ✅ 持久化 - RDB格式的持久化支持
- ✅ 主从复制 - 支持异步主从复制
- ✅ 事务 - 完整的事务和WATCH支持
- ✅ 模块化设计 - 基于JSON的命令配置系统
tinyredis/
├── CMakeLists.txt
├── config/ # 命令配置
├── deps/ # 依赖库
├── dump.rdb # rdb文件
├── include/ # 头文件
├── src/ # 源文件
├── install_deps_to_system.sh # 安装依赖脚本
└── uninstall_deps_from_system.sh # 卸载脚步脚本
- C++23 兼容的编译器 (GCC 13+ / Clang 16+)
- Boost.Asio
- nlohmann-json
- spdlog
- CMake 3.13+
git clone https://github.com/yourusername/tinyredis.git
cd tinyredis
sudo ./install_deps_to_system.sh
mkdir build && cd build
cmake ..
make -j8# 默认端口6379启动
./redis
# 指定端口
./redis --port 6380
# 以副本模式启动
./redis --port 6380 --replicaof "localhost 6379"
# 指定RDB文件
./redis --dir /var/lib/redis --dbfilename dump.rdb
# 设置密码
./redis --requirepass mypassword
# 查看帮助
./redis --help使用标准 redis-cli 连接:
redis-cli -p 6379
> PING
PONG
> SET foo bar
OK
> GET foo
"bar"