Redis 结构
大约 2 分钟RedisRedisRedis 设计与实现
Redis 结构
Redis 是一个键值对数据库服务器,服务器中的每个数据库都是由一个 redisDb
结构表示,redisDb
的 dict
字典保存了所有的键值对。
typedef struct redisDb {
// 数据库键空间,保存着数据库中的所有键值对
dict *dict;
} redisDb;
dict
和用户所见的数据库是直接对应的,键是一个字符串对象,值是任意一种 Redis 对象。

1 维护操作
- 在读取一个键后,服务器会记录更新键空间的命中次数或不命中的次数,通过
info
命令可以查看。 - 在读取一个键后,服务器会更新键的 LRU 时间。
- 读取一个键时会先判断是否已经过期,如果过期会删除这个键。
2 过期
2.1 过期时间
Redis 可以通过命令设置键的生存时间、过期时间。
expire key ttl
生存时间秒。pexpire key ttl
生存时间毫秒。expireat key timestamp
设置过期时间为timestamp秒。pexpireat key timestamp
设置过期时间为timestamp毫秒。
2.2 保存过期时间
通过一个字典保存所有键的过期时间,过期字典的键是一个指针指向键空间中的某个键对象,值是一个 long long
类型的整数保存了过期时间。

3 过期键删除策略
3.1 定时删除
在设置键过期时间的同时,定义一个定时器,在过期时间来临时立即执行删除。
定时删除可以保证键会尽可能的被删除释放内存,但是过多的定时器会占用 cpu,影响性能。
3.2 惰性删除
在获取键时,检查键是否过期,如果过期就删除该键。
惰性删除只有在获取的时候才会检查,不会占用额外的 cpu
,但是会导致占用的内存不会被释放。如果没有访问的键就会一直占用在内存中。
3.3 定期删除
每隔一段时间删除过期的键。是对前两种方案的折中,但是需要合理设置定期的策略。
4 RDB 与 AOF 的过期策略
4.1 RDB
在生成 RDB
文件的时候,如果有过期键就会被忽略。
在载入RDB
文件的时候,如果是主服务器模式,有过期键就会被忽略。如果是从服务器则会加载所有数据。
4.2 AOF
当一个键过期且被删除后,会在 AOF
文件中记录一条del记录,在 AOF
重写过程中已过期的键不会被重写到 AOF
文件中。
5 复制
在服务器运行在复制模式下,主服务器删除一个过期键,会显示的发送一个 del
命令通知从服务器。