Redis 单机数据库的实现—数据库

服务器中的数据库

切换数据库

数据库键空间

设置键的过期时间

设置过期时间

  • EXPIRE
  • PEXPIRE
  • EXPIREAT
  • PEXPIREAT

服务器内部对这四种命令的实现实质上是一样的,最终都会转换成 PEXPIREAT。

保存过期时间

移除过期时间

  • PERSIST

计算并返回剩余过期时间

  • TTL
  • PTTL

过期键的判定

  1. 是否存在过期字典中,不存在返回 -1
  2. 检查当前 UNIX 时间戳是否大于键的过期时间,如果是的话键已过期,否则未过期

过期键删除策略

定时删除

使用定时器,在键过期之后立马删除。

优点:

  • 保证过期键尽快被删除,并释放内存

缺点:

  • 占用 CPU,可能会影响响应时间和吞吐量
  • 当前时间事件使用无序链表实现,查找复杂度高,不能高效处理大量时间事件

惰性删除

在获取键的时候检查过期。

优点:

  • 不会消耗 CPU

缺点:

  • 浪费内存,过期键不能及时删除,也可能永远不被删除

定期删除

每隔一段时间,检查数据库所有键是否过期。
是定时删除和惰性删除的折中,需要合理设置删除的时长和频率。

AOF、RDB 和复制功能对过期键的处理

  • 生成 RDB 文件时,不会将过期的数据保存进去;载入 RDB 文件时,如果以主服务器模式运行会忽略过期键,如果以从服务器模式运行,会在主从数据同步的时候,从库中的过期数据被清空。
  • AOF 文件写入时,会在过期被删除之后,向 AOF 中追加删除命令;AOF 重写时,不会保存已过期的数据。
  • 复制模式下,从服务器不会删除过期键,是主服务器发送一个删除命令后才会删除,保证主从数据一致性。

数据库通知

  • 键空间通知,关注某个键执行了什么命令
  • 键事件通知,关注某个命令被什么键执行了
-------------本文结束感谢您的阅读-------------