首页天道酬勤redis删除过期key,redis最大键

redis删除过期key,redis最大键

张世龙 05-05 16:56 48次浏览

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

定期删除

惯性删除

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

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

1 .定期删除

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

从过期词典中随机抽取20个密钥;

删除这20个密钥中过期的密钥;

如果过期的密钥比率超过1/4,请重复步骤1

此外,为了防止过期扫描循环过多而导致线程锁定,算法增加了扫描时间上限,默认情况下不超过25ms。

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

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

默认情况下,redis定时任务每10s运行一次。 如果要更改此值,可以在redis.conf中更改hz值。

在redis.conf中,hz默认设置为10,提高该值将消耗更多的cpu。 当然,相应的redis会更准确地处理同时过期的许多密钥和超时。

hz的可取值范围为1~500,通常不推荐超过100,只有在请求延迟非常低的情况下才能使值上升到100。

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

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

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

2 .懒惰删除

在计划删除策略中,从删除方法来看,密钥可能已过期,但尚未从redis中删除。

在这种情况下,redis在操作key时,首先判断该值是否过期,如果过期,则删除该key; 如果未过期,请执行后续操作。

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

远程数据库

生成rdb文件:生成时,程序检查密钥,过期密钥不能放入rdb文件中。

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

亚奥夫

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

在aof改写过程中,程序检查数据库中的密钥,过期的密钥不保存在改写后的aof文件中。

复制

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

删除过期密钥时,主服务器会显式向所有从服务器发送del命令,通知您从服务器中删除过期密钥。

当服务器运行客户端发送的读取命令时,它不会删除过期密钥,即使遇到过期密钥,也会像处理未过期密钥一样继续处理过期密钥。

只有在接收到来自主服务器的del命令后,才会从服务器中删除过期密钥。

redis内存满了会怎样,redis存储