首页 > 编程知识 正文

redis定期删除配置,redis缓存过期策略

时间:2023-05-03 16:10:33 阅读:14715 作者:2601

redis服务实际使用的过期密钥删除策略有以下两种:

如果定期删除惯性删除redis,则每个已过期的密钥都会被放入其他词典中,以后定期遍历此词典以删除过期的密钥。 除了时间遍历外,还使用禁用策略删除过期的密钥。 禁用策略是客户端访问此密钥时,redis会检查密钥是否过期,并在过期后立即删除。 定时删除为集中处理,惯性删除为零散处理。

这两种删除策略的结合使服务器能够在合理使用cpu时间和不浪费内存空间之间取得平衡。

1 .定期删除Redis时,默认情况下每秒进行10次过期扫描。 过期扫描采用了简单的贪婪策略,而不是遍历过期词典中的所有密钥。

从过期词典中随机抽取20个密钥; 删除这20个密钥中过期的密钥; 如果过期密钥比率超过1/4,则重复步骤1。此外,为了防止过期扫描循环过多而导致线程锁定,算法增加了扫描时间上限,默认情况下不超过25ms。

如果在某个时间点大量key同时过期,则Redis会继续扫描过期的词典,客户端会对纸箱做出响应,因此在设置过期日期时尽量避免此问题,在设置过期日期时,Redis会为过期日期设置随机范围,依此类推

1.1如何设置定期删除执行间隔

默认情况下,redis定时任务在1s上运行10次。 每100ms一次,值越大,刷新频率越高,最大redis性能损失也越大。 (要更改此值,请在redis.conf中更改hz值。

在redis.conf中,hz默认设置为10,提高该值将消耗更多的cpu。 当然,相应的redis会更准确地处理同时过期的许多密钥和超时。 hz的可取值范围为1~500,通常不推荐超过100,只有在请求延迟非常低的情况下才能使值上升到100。

1.2单线程redis,如何知道要执行定时任务?

redis是单线程,线程不仅处理定时任务,还处理客户端请求。 线程在处理定时任务和客户端请求方面无法阻止。 那么,redis如何知道应该执行定时任务呢?

Redis的计划任务记录在称为最小堆的数据结构中。 在这个堆中,运行最快的任务位于堆的顶部。 在每个周期,Redis都会立即处理达到最小堆中点的任务。 处理完成后,记录最早执行的任务所需的时间。 此时间是下一次处理客户端请求的最长时间。 如果达到此时间,则运行计划任务,而不临时处理客户端的请求。

2 .处理2. aof/rdb和复制功能过期密钥rdb

生成rdb文件:生成时,程序检查密钥,过期密钥不能放入rdb文件中。 加载rdb文件:加载时,如果在主服务器模式下运行,程序将检查文件中存储的密钥,未过期的密钥将加载到数据库中,过期的密钥将被忽略。 在从属服务器模式下运行时,无论密钥是否过期,都将加载到数据库中,过期的密钥将通过与主服务器同步被删除。 亚奥夫

如果服务器在aof持久化模式下运行,并且数据库中的任何密钥已过期,但尚未删除,则此过期密钥不会影响aof文件。 删除过期密钥后,程序会将del命令添加到aof文件中,以显式记录密钥已被删除。 在aof改写过程中,程序检查数据库中的密钥,过期的密钥不保存在改写后的aof文件中。 复制

如果服务器在复制模式下运行,则从服务器中删除过期的操作由主服务器控制。

删除过期密钥时,主服务器会显式向所有从服务器发送del命令,通知您从服务器中删除过期密钥。 当服务器运行客户端发送的读取命令时,它不会删除过期密钥,即使遇到过期密钥,也会像处理未过期密钥一样继续处理过期密钥。 只有在接收到来自主服务器的del命令后,才会从服务器中删除过期密钥。 面试问题分析redis过期政策3358 www.Sina.com/http://www.Sina.com /

假设redis包含10w个密钥,并且所有密钥都已过期。 你每几百毫秒检查10w个密钥。 那个redis基本上就死了。 cpu负载变高,消耗在你的检查有效期限key上。 请注意,这里并不是每100ms遍历所有过期的密钥。 那是一场表演上的灾难。 实际上,redis每100ms随机抽取一些密钥进行检查并删除。

但是问题是,如果定期删除,很多过期的密钥可能到了时间也不会被删除。 我该怎么办? 这就是为什么惯性删除了它。 也就是说,获取某个密钥时,redis会检查该密钥是否已过期(如果设置了过期日期)。 过期后在此时删除。 什么都不还给我。redis 过期策略是:定期删除+惰性删除。

但是,实际上还存在问题。 如果定期删除,遗漏了很多过期的密钥,即使立即检查也没有惯性删除,此时会怎么样? 如果内存中堆积了大量过期密钥,redis内存块消失了,怎么办?

答案是走内存销毁机制。

p> 内存淘汰机制

redis 内存淘汰机制有以下几个:
• noeviction: 当内存不足以搞怪的山水写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
• allkeys-lru:当内存不足以搞怪的山水写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
• allkeys-random:当内存不足以搞怪的山水写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
• volatile-lru:当内存不足以搞怪的山水写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
• volatile-random:当内存不足以搞怪的山水写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
• volatile-ttl:当内存不足以搞怪的山水写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。