阅读文本大概需要 8 分钟。
今天,我和大家分享一篇关于 Redis 有关过期键的内容,主要有四个内容:
1. 如何设置过期键
2. 如何取消设置的过期时间
3. 过期键的过期策略是怎样的
4. RDB、AOF 和复制对过期键的处理又是怎样的
1. 设置键的过期时间
redis 一共有 4 个命令来设置键的生存时间(可以存活多久)或过期时间(什么时候被删除)
1. expire :将 key 的生存时间设置为 ttl 秒
2. pexpire :将 key 的生存时间设置为 ttl 毫秒
3. expireat :将 key 的过期时间设置为 timestamp 所指定的秒数时间戳
4. pexpireat :将 key 的过期时间设置为 timestamp 所指定的毫秒数时间戳
本质上,上述四种命令都是通过 pexpireat 命令来实现的。
下面我们简单实践一下命令(因为命令比较简单,这里我只使用 expire 和 expireat 来举个例子)
设置过期键就是按照上述命令去操作,那如果说,自己不小心设置错了过期时间,那么我们应该怎么办呢?—— 答案是可以删除先前的过期时间。
2. 移除过期时间
移除也很简单,通过persist 命令可以移除一个键的过期时间,举个栗子:
此时,如果我们没有移除过期时间,那么如果一个键过期了,那它什么时候会被删除呢?
这个问题就会有以下三种答案了,它们分别代表三种不同的删除策略
3. 过期键的删除策略
三种不同的删除策略分别是:
1. 定时删除
2. 惰性删除
3. 定期删除
下面我详细说下这三个策略是什么作用,区别是什么。
3.1定时删除
在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
优点:对内存最友好的。可以及时释放键所占用的内存。
缺点:对 CPU 不友好。特别在过期键比较多的情况下,删除过期键会占用相当一部分 CPU 时间。同时在内存不紧张,CPU 紧张的情况下,将 CPU 用在删除和当前任务不想关的过期键上,无疑会对服务器响应时间和吞吐量造成影响。
3.2 惰性删除
放任键过期不管,但是每次从键空间中读写键时,都会检查取得的键是否过期。如果过期就删除该删,否则就返回该键。
PS:键空间是一个保存了数据库所有键值对的数据结构
优点:对 CPU 最友好。只有在操作的时候进行过期检查,删除的目标仅限于当前需要处理的键,不会在删除其他无关本次操作的过期键上花费任何 CPU 时间。
缺点:对内存不友好。这个十分容易理解了,键过期了,但因为一直没有被访问到,所以一直保留着(除非手动执行 flushdb 操来于清空当前数据库中的所有 key),相当于内存泄漏。
3.3定期删除
每隔一段时间,程序就对数据库进行检查,删除里面的过期键。至于要删除多少过期键,以及检查多少数据库,则有算法决定。
该策略是上述两种策略的折中方案,需要通过实际情况,来设置删除操作的执行时长和频率。
明白了过期键的删除策略后,那 redis 服务器又是采用什么策略来删除过期键的呢?
实际上,Redis 服务器使用的是惰性删除和定期删除两种策略,通过配合使用,服务器可以很好的平衡 CPU 和内存。
其中惰性删除为 redis 服务器内置策略。而定期删除可以通过以下两种方式设置:
1. 配置 redis.conf 的 hz 选项,默认为10 (即 1 秒执行 10 次,值越大说明刷新频率越快,对 Redis 性能损耗也越大)
2. 配置 redis.conf 的 maxmemory 最大值,当已用内存超过 maxmemory 限定时,就会触发主动清理策略
4. RDB 对过期键的处理
先下结论:过期键对 RDB 不会造成影响
4.1生成 RDB 文件
程序会被数据库中的键进行检查,过期的键不会被保存到新创建的 RDB 文件中。因此数据库中的过期键不会对生成新的 RDB 文件造成影响
4.2载入 RDB 文件
这里需要分 2 种情况说明:
1. 如果服务器以主服务器模式运行,则在载入 RDB 文件时,程序会对文件中保存的键进行检查,过期键不会被载入到数据库中。所以过期键不会对载入 RDB 文件的主服务器造成影响。
2. 如果服务器以从服务器模式运行,则在载入 RDB 文件时,不论键是否过期都会被载入到数据库中。
但由于主从服务器在进行数据同步时,从服务器的数据会被清空。所以一般来说,过期键对载入 RDB 文件的从服务器也不会造成影响。
5. AOF 对过期键的处理
结论同样是不会造成影响,下面接着细说
5.1AOF 文件写入
当服务器以 AOF 持久化模式运行时,如果数据库某个过期键还没被删除,那么 AOF 文件不会因为这个过期键而产生任何影响,依旧保留。
而当过期键被删除后,那么程序会向 AOF 文件追加一条 DEL 命令来显式地记录该键被删除。
5.2AOF 重写
执行 AOF 重写过程中,也会被数据库的键进行检查,已过期的键不会被保存到重写后的 AOF 文件中。因此不会对 AOF 重写造成影响
6. 复制对过期键的处理
当服务器运行在复制模式下,由主服务器来控制从服务器的删除过期键动作,目的是保证主从服务器数据的一致性。
那到底是怎么控制的呢?
1. 主服务器删除一个过期键后,会向所有从服务器发送一个 DEL 命令,告诉从服务器删除这个过期键
2. 从服务器接受到命令后,删除过期键
PS:从服务器在接收到客户端对过期键的读命令时,依旧会返回该键对应的值给客户端,而不会将其删除。
--End--
Java、MySQL、Redis、Linux、mq
数据结构、设计模式、编程思想、架构
领取专属 10元无门槛券
私享最新 技术干货