跳至主要內容

Redis 结构

blacklad大约 2 分钟RedisRedisRedis 设计与实现

Redis 结构

Redis 是一个键值对数据库服务器,服务器中的每个数据库都是由一个 redisDb 结构表示,redisDbdict 字典保存了所有的键值对。

typedef struct redisDb {
    // 数据库键空间,保存着数据库中的所有键值对
    dict *dict;
} redisDb;

dict 和用户所见的数据库是直接对应的,键是一个字符串对象,值是任意一种 Redis 对象。

1 维护操作

  1. 在读取一个键后,服务器会记录更新键空间的命中次数或不命中的次数,通过 info 命令可以查看。
  2. 在读取一个键后,服务器会更新键的 LRU 时间。
  3. 读取一个键时会先判断是否已经过期,如果过期会删除这个键。

2 过期

2.1 过期时间

Redis 可以通过命令设置键的生存时间、过期时间。

  1. expire key ttl 生存时间秒。
  2. pexpire key ttl 生存时间毫秒。
  3. expireat key timestamp 设置过期时间为timestamp秒。
  4. 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 命令通知从服务器。

上次编辑于:
贡献者: blacklad