一、过期设置
1.1 过期设置的指令
1 SET key value // 存入键值对 2 3 EXPIRE key 5 // 设置过期时间(秒) 4 PEXPIRE key 5000 // 设置过期时间(毫秒) 5 6 TTL key // 返回key剩余过期时间(Time To Live) 7 8 PRESIST key // 移除键的过期时间 9 10 TIME // 查看当前时间戳
1.2 指令转换关系
- 所有设置时间的指令最终都会转换成为PEXPIREAT指令:以毫秒精度,设置过期时间(一个UNIX时间戳),当过期时间来临时,服务器自动删除该键
- EXPIREAT:以秒为单位设置过期时间(时间戳)
- 转换关系:
1.3 检查过期策略
- 检查给定键是否存在过期字典,如果存在,则取得键的过期时间(redisDb.expires过期字典保存了所有键过期时间)
- 检查当前的UNIX时间戳是否大于键的过期时间,大于的话则键已经过期
二、清除策略
2.1 定时过期
每个设置过期时间的key创建一个定时器,到过期时间就会立即清除。
- 优点:内存友好,及时清理
- 缺点:占用大量的cpu资源处理过期数据,影响缓存的响应时间和吞吐量
2.2 惰性过期
访问一个key时,才判断该key是否已经过期,过期则清除。
- 优点:最大化节约cpu资源
- 缺点:对内存不友好,可能存在大量key没有再次被访问而占用大量内存的问题
2.3 定期过期
每隔一段时间,扫描一定数量的数据库expires字典中一定数量的key,清除其中过期的key。
Redis服务器使用了惰性过期和定期过期两种过期策略。
三、持久化对过期键处理
3.1 RDB
- 保存快照时,过期键不保存
- 载入RDB文件时
- 主服务器:检查剔除过期键(不载入过期键)
- 从服务器:会载入所有数据(载入过期键),不过主服务器在数据同步的时候,从服务器的数据会被清空,所以载入过期键并不会造成影响
3.2 AOF
3.3 主从复制
- 主服务器删除一个过期键后,会显示地向所有从服务器发送一个DEL命令,告知从服务器删除过期键
- 从服务器在执行客户端发送地读命令时,即使遇到过期键也不会删除(惰性过期),而是继续像处理未过期键一样处理过期键,会正常返回查询结果。
- 从服务器只有在收到主服务器发来的DEL命令之后,才会删除过期键
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。