文章参考:《Redis 设计与实现》黄建宏

设置过期时间

通过 EXPIRE 或者 PEXPIRE 命令,客户端可以以秒或毫秒精度为数据库中的某个键设置生存时间 TTL (Time To Live)

SETEX 命令可以设置一个字符串的同时为键设置过期时间

保存过期时间

redisDb 结构的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:

  • 过期字典的键是一个指针,这个指针指向键空间中的某个键对象
  • 过期字典的值十亿额 long long 类型的整数,保存了键的过期时间, 一个毫秒精度的 UNIX 时间戳
typedef struct redisDb{
// ...
// 过期字典
dict *expires;
// ...
} redisDb;

过期键的判定

通过过期字典,可以用以下步骤检查一个给定键是否过期:

  1. 检查给定键是否存在于过期字典中,如果存在,那么取得键的过期时间
  2. 检查当前 UNIX 时间戳是否大于该键的过期时间,如果是的话, 那么键已经过期

过期键的删除策略

  1. 定时删除:在设置键的过期时间同时,创建一个定时器 timer,让定时器在键的过期时间来临时,立即执行对键的删除操作, 对内存最友好,占用大量 CPU,所以现阶段不现实
  2. 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除该键,如果没有过期,就返回该键,对 CPU 友好,对内存不友好

在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那他们也许永远也不会被删除,除非手动执行 FLUSHDB, 我们甚至可以将这种情况看作是一种内存泄漏,这对于运行状态非常依赖内存的 Redis 服务器来说,肯定不是一个好消息。

  1. 定期删除:每隔一段时间,程序就对数据库进行一次检查, 删除里面的过期键

其中, Redis 使用了惰性删除和定期删除两种策略

最新文章

  1. eclipse格式化代码
  2. 如何在linux中配置PHP环境
  3. Merge OUTPUT 高级用法综合写的一个MergeTab的存储过程
  4. ftp报错 200 port command successful. consider using pasv 425 failed to establish connection
  5. js创建对象的方式 三种
  6. 离线安装gcc(CentOS7)
  7. Windows下编译mxnet
  8. 19.QT-事件发送函数sendEvent()、postEvent()
  9. C#數據庫
  10. python3 电脑说话
  11. 对于已经添加引用,还找不到类型或名字空间的错误及svn客户端清除用户帐号密码
  12. html5手机移动端三级联动城市选择器
  13. websphere 进程
  14. flash as3.0 截图保存图片
  15. 手机Gmail上用Exchange协议配置收发QQ邮箱
  16. Service 保活法之一
  17. 第一个Hibernate 程序
  18. 为什么要把session存入数据库
  19. virtualbox+vagrant学习-5-Boxes-2-Box Versioning
  20. 用 Nokitjs 解决前端开发中的跨域问题

热门文章

  1. CentOS6.7系统文本安装-2020
  2. Linux_部署日志服务器
  3. Linux 操作系统(三) 添加用户、切换用户、删除用户
  4. openstack总结复习
  5. k8s 管理存储资源(10)
  6. MyBatis 项目开发中是基于 XML 还是注解?
  7. Winsock2使用记录
  8. ELK搭建-windows
  9. Fine-Tuning微调原理
  10. Docker系列——Grafana+Prometheus+Node-exporter微信推送(三)