godis-tiny 是一个用 Go 语言实现的简化版 Redis 服务器。我创建这个项目是为了了解 Redis 服务器的实现原理和提高自己的 Go 语言编程技能。
go run main.go
- 命令处理:采用单线程处理方式,简化了线程安全问题和锁机制。
- 过期键处理:使用按过期时间排序的优先队列替代传统的时钟轮,结合定时清理和主动随机清理来管理过期键。
- 网络库:集成使用 gnet 提供高性能的网络处理。
- AOF 及 AOF 重写:支持追加文件(Append-Only File)日志和后台重写功能。
-
键值命令:
set key value
:设置键的值。get key
:获取指定键的值。del key
:删除指定的键。exists key
:检查键是否存在。getset key
:设置新值并返回旧值。strlen key
:获取键对应值的字符串长度。keys pattern
:查找符合模式的键。getdel key
:获取并删除键。incr key
:自增键的值。decr key
:自减键的值。incrby key step
:增加键的值。decrby key step
:减少键的值。mget [key...]
:同时获取多个键的值。mset pairs
:同时设置多个键值对。getrange key start end
:获取值中指定范围的子字符串。
-
列表命令:
lpush key [elements]
:从左侧推入元素到列表。rpush key [elements]
:从右侧推入元素到列表。lpop key count
:从左端弹出指定数量的元素。rpop key count
:从右端弹出指定数量的元素。lrange key start end
:获取列表指定范围内的元素。llen key
:获取列表的长度。lindex key index
:获取列表中指定索引的元素。
-
哈希命令:
hset key field value
:设置哈希表的字段值。hget key field
:获取哈希表指定字段的值。
-
集合命令:
sadd key member
:向集合添加成员。smembers key
:返回集合中的所有成员。scard key
:获取集合的成员数量。
-
持久化和维护命令:
bgrewriteaof
:后台 AOF 重写。flushdb
:刷新数据库。ttl key
:获取键的剩余生存时间。pttl key
:获取键的剩余生存时间(毫秒)。expire key seconds
:设置键的过期时间(秒)。persist key
:移除键的过期时间。expireat key
:在指定时间点让键过期。
-
其他命令:
ping [message]
:测试连接或发送响应信息。select db
:选择数据库。type key
:返回键的类型。ttlops
:内部命令,触发ttlquit
:退出客户端连接。memory
:查看键占用的内存。info
:提供服务器信息的部分实现。gc
:尝试触发垃圾回收。
- RDB 持久化:实现 Redis 数据库文件持久化功能。
- 主从复制模式:探索和实现 Redis 的主从复制。
- Linux
- macOS
- Windows:注意
gnet
对 Windows 的支持尚不完全,可能影响性能。
- 向 HDT3213 的 godis 表示感谢。
- 向 panjf2000 的 gnet 表示感谢。