redis过期键
一、过期设置
1.1 过期设置的指令
- Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间
- expire可以设置过期时间
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。
- 优点:定期过期是对上面两种方式的一种整合和折中,通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
- 缺点:难以确定删除操作执行的时长、频率
Redis服务器使用了惰性过期和定期过期两种过期策略。
三、持久化对过期键处理
3.1 RDB
- 保存快照时,过期键不保存
- 载入RDB文件时
- 主服务器:检查剔除过期键(不载入过期键)
- 从服务器:会载入所有数据(载入过期键),不过主服务器在数据同步的时候,从服务器的数据会被清空,所以载入过期键并不会造成影响
3.2 AOF
- 文件写入时,如果某个键已经过期
- 没有被惰性过期/定期过期删除,AOF不会因为键过期产生任何影响(保存写操作)
- 当过期键被惰性过期/定期过期删除,程序向AOF中追加一条DEL命令来表示该键已经被删除
- 文件重写时,检查剔除过期键(已过期键不会被重写入AOF文件中)
3.3 主从复制
- 主服务器删除一个过期键后,会显示地向所有从服务器发送一个DEL命令,告知从服务器删除过期键
- 从服务器在执行客户端发送地读命令时,即使遇到过期键也不会删除(惰性过期),而是继续像处理未过期键一样处理过期键,会正常返回查询结果。
- 从服务器只有在收到主服务器发来的DEL命令之后,才会删除过期键
本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/15092024.html