你应该知道的Redis过期键和过期策略
今天,我和大家分享一篇关于 Redis 有关过期键的内容,主要有四个内容:
- 如何设置过期键
- 如何取消设置的过期时间
- 过期键的过期策略是怎样的
- RDB、AOF 和复制对过期键的处理又是怎样的
- expire :将 key 的生存时间设置为 ttl 秒
- pexpire :将 key 的生存时间设置为 ttl 毫秒
- expireat :将 key 的过期时间设置为 timestamp 所指定的秒数时间戳
- pexpireat :将 key 的过期时间设置为 timestamp 所指定的毫秒数时间戳
例子:
127.0.0.1:6379> set a test
OK
127.0.0.1:6379> EXPIRE a 5
(integer) 1
127.0.0.1:6379> get a // 距离设置生存时间命令的 5 秒内执行
"test"
127.0.0.1:6379> get a // 距离设置生存时间命令的 5 秒后执行
(nil)127.0.0.1:6379> set b 12
OK
127.0.0.1:6379> EXPIREAT b 1545569500
(integer) 1
127.0.0.1:6379> time
1) "1545569486"
2) "108616"
127.0.0.1:6379> get b // 距离设置 1545569500 所指定的秒数时间戳内执行
"12"
127.0.0.1:6379> time
1) "1545569506"
2) "208567"
127.0.0.1:6379> get b // 距离设置 1545569500 所指定的秒数时间戳后执行
(nil)
如果自己不小心设置错了过期时间,那么我们可以删除先前的过期时间
移除过期时间 persist 命令可以移除一个键的过期时间,举个栗子:
127.0.0.1:6379> EXPIRE c 1000
(integer) 1
127.0.0.1:6379> ttl c// 有过期时间
(integer) 9996
127.0.0.1:6379> PERSIST c
(integer) 1
127.0.0.1:6379> ttl c// 无过期时间
(integer) -1PS:ttl 是以秒为单位,返回键的剩余生存时间;同理还有 pttl 命令是以毫秒为单位,返回键的剩余生存时间
此时,如果我们没有移除过期时间,那么如果一个键过期了,那它什么时候会被删除呢?
这个问题就会有以下三种答案了,它们分别代表三种不同的删除策略
过期键的删除策略 定时删除 在设置键的过期时间的同时,我们自己创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
优点:对内存最友好的。可以及时释放键所占用的内存。
缺点:对 CPU 不友好。特别在过期键比较多的情况下,删除过期键会占用相当一部分 CPU 时间。同时在内存不紧张,CPU 紧张的情况下,将 CPU 用在删除和当前任务不想关的过期键上,无疑会对服务器响应时间和吞吐量造成影响。
惰性删除 放任键过期不管,但是每次从键空间中读写键时,都会检查取得的键是否过期。如果过期就删除该删,否则就返回该键。(PS:键空间是一个保存了数据库所有键值对的数据结构)
优点:对 CPU 最友好。只有在操作的时候进行过期检查,删除的目标仅限于当前需要处理的键,不会在删除其他无关本次操作的过期键上花费任何 CPU 时间。
缺点:对内存不友好。这个十分容易理解了,键过期了,但因为一直没有被访问到,所以一直保留着(除非手动执行 flushdb 操来于清空当前数据库中的所有 key。),相当于内存泄漏。
定期删除 每隔一段时间,程序就对数据库进行检查,删除里面的过期键。至于要删除多少过期键,以及检查多少数据库,则有算法决定。
该策略是上述两种策略的折中方案,需要通过实际情况,来设置删除操作的执行时长和频率。
明白了过期键的删除策略后,那 redis 服务器又是采用什么策略来删除过期键的呢?
实际上,Redis 服务器使用的是惰性删除和定期删除两种策略,通过配合使用,服务器可以很好的平衡 CPU 和内存。
其中惰性删除为 redis 服务器内置策略。而定期删除可以通过以下两种方式设置:
- 配置 redis.conf 的 hz 选项,默认为10 (即 1 秒执行 10 次,值越大说明刷新频率越快,对 Redis 性能损耗也越大)
- 配置 redis.conf 的 maxmemory 最大值,当已用内存超过 maxmemory 限定时,就会触发主动清理策略
载入 RDB 文件 这里需要分情况说明:
- 如果服务器以主服务器模式运行,则在载入 RDB 文件时,程序会对文件中保存的键进行检查,过期键不会被载入到数据库中。所以过期键不会对载入 RDB 文件的主服务器造成影响。
- 如果服务器以从服务器模式运行,则在载入 RDB 文件时,不论键是否过期都会被载入到数据库中。但由于主从服务器在进行数据同步时,从服务器的数据会被清空。所以一般来说,过期键对载入 RDB 文件的从服务器也不会造成影响。
而当过期键被删除后,那么程序会向 AOF 文件追加一条 DEL 命令来显式地记录该键被删除。
AOF 重写 执行 AOF 重写过程中,也会被数据库的键进行检查,已过期的键不会被保存到重写后的 AOF 文件中。因此不会对 AOF 重写造成影响
复制对过期键的处理 当服务器运行在复制模式下,由主服务器来控制从服务器的删除过期键动作,目的是保证主从服务器数据的一致性。
那到底是怎么控制的呢?
- 主服务器删除一个过期键后,会向所有从服务器发送一个 DEL 命令,告诉从服务器删除这个过期键
- 从服务器接受到命令后,删除过期键
推荐阅读
- css|css 底部划线_一个非常实用的CSS小技巧,帮你应对各种场景
- C语言必学的数据结构|还在抱怨数据结构难? 一文带你搞懂如何AC算法题(2022版)
- Android|薪资倒挂(行业内卷?2022年最新Android学习路线整理分享,带你干倒世界卷王)
- JDK8的|JDK8的 CHM 为何放弃分段锁
- 萌新看过来,你还学不懂VScode插件吗()
- 每日算法之数组(二)
- CMake编译中的库文件和头文件链接你了解吗
- 笔记|手机也有生产力,手把手教你用手机开发APP
- java|卷不动了(300 秒快速了解 Java 9 - 16 新特性,助你脱离内卷)
- 历时三个月,史上最详细的Spring注解驱动开发系列教程终于出炉了,给你全新震撼