Redis 过期时间解析
2024-08-28 06:06:10
文章参考:《Redis 设计与实现》黄建宏
设置过期时间
通过 EXPIRE 或者 PEXPIRE 命令,客户端可以以秒或毫秒精度为数据库中的某个键设置生存时间 TTL (Time To Live)
SETEX 命令可以设置一个字符串的同时为键设置过期时间
保存过期时间
redisDb 结构的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:
- 过期字典的键是一个指针,这个指针指向键空间中的某个键对象
- 过期字典的值十亿额 long long 类型的整数,保存了键的过期时间, 一个毫秒精度的 UNIX 时间戳
typedef struct redisDb{
// ...
// 过期字典
dict *expires;
// ...
} redisDb;
过期键的判定
通过过期字典,可以用以下步骤检查一个给定键是否过期:
- 检查给定键是否存在于过期字典中,如果存在,那么取得键的过期时间
- 检查当前 UNIX 时间戳是否大于该键的过期时间,如果是的话, 那么键已经过期
过期键的删除策略
- 定时删除:在设置键的过期时间同时,创建一个定时器 timer,让定时器在键的过期时间来临时,立即执行对键的删除操作, 对内存最友好,占用大量 CPU,所以现阶段不现实
- 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除该键,如果没有过期,就返回该键,对 CPU 友好,对内存不友好
在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那他们也许永远也不会被删除,除非手动执行 FLUSHDB, 我们甚至可以将这种情况看作是一种内存泄漏,这对于运行状态非常依赖内存的 Redis 服务器来说,肯定不是一个好消息。
- 定期删除:每隔一段时间,程序就对数据库进行一次检查, 删除里面的过期键
其中, Redis 使用了惰性删除和定期删除两种策略
最新文章
- eclipse格式化代码
- 如何在linux中配置PHP环境
- Merge OUTPUT 高级用法综合写的一个MergeTab的存储过程
- ftp报错 200 port command successful. consider using pasv 425 failed to establish connection
- js创建对象的方式 三种
- 离线安装gcc(CentOS7)
- Windows下编译mxnet
- 19.QT-事件发送函数sendEvent()、postEvent()
- C#數據庫
- python3 电脑说话
- 对于已经添加引用,还找不到类型或名字空间的错误及svn客户端清除用户帐号密码
- html5手机移动端三级联动城市选择器
- websphere 进程
- flash as3.0 截图保存图片
- 手机Gmail上用Exchange协议配置收发QQ邮箱
- Service 保活法之一
- 第一个Hibernate 程序
- 为什么要把session存入数据库
- virtualbox+vagrant学习-5-Boxes-2-Box Versioning
- 用 Nokitjs 解决前端开发中的跨域问题