redis 数据删除策略和逐出算法 (4)

hz调大将会提高Redis主动淘汰的频率,如果你的Redis存储中包含很多冷数据占用内存过大的话,可以考虑将这个值调大,但Redis作者建议这个值不要超过100。我们实际线上将这个值调大到100,观察到CPU会增加2%左右,但对冷数据的内存释放速度确实有明显的提高(通过观察keyspace个数和used_memory大小)。

可以看出timelimit和server.hz是一个倒数的关系,也就是说hz配置越大,timelimit就越小。换句话说是每秒钟期望的主动淘汰频率越高,则每次淘汰最长占用时间就越短。这里每秒钟的最长淘汰占用时间是固定的250ms(1000000*ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC/100),而淘汰频率和每次淘汰的最长时间是通过hz参数控制的。

因此当redis中的过期key比率没有超过25%之前,提高hz可以明显提高扫描key的最小个数。假设hz为10,则一秒内最少扫描200个key(一秒调用10次*每次最少随机取出20个key),如果hz改为100,则一秒内最少扫描2000个key;另一方面,如果过期key比率超过25%,则扫描key的个数无上限,但是cpu时间每秒钟最多占用250ms。

当REDIS运行在主从模式时,只有主结点才会执行上述这两种过期删除策略,然后把删除操作”del key”同步到从结点。

if (server.active_expire_enabled && server.masterhost == NULL) // 判断是否是主节点 从节点不需要执行activeExpireCycle()函数。 // 清除模式为 CYCLE_SLOW ,这个模式会尽量多清除过期键 activeExpireCycle(ACTIVE_EXPIRE_CYCLE_SLOW); 随机个数

redis.config.ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 决定每次循环从数据库 expire中随机挑选值的个数

逐出算法

如果不限制 reids 对内存使用的限制,它将会使用全部的内存。可以通过 config.memory 来指定redis 对内存的使用量 。

下面是redis 配置文件中的说明

543 # Set a memory usage limit to the specified amount of bytes. 544 # When the memory limit is reached Redis will try to remove keys 545 # according to the eviction policy selected (see maxmemory-policy). 546 # 547 # If Redis can't remove keys according to the policy, or if the policy is 548 # set to 'noeviction', Redis will start to reply with errors to commands 549 # that would use more memory, like SET, LPUSH, and so on, and will continue 550 # to reply to read-only commands like GET. 551 # 552 # This option is usually useful when using Redis as an LRU or LFU cache, or to 553 # set a hard memory limit for an instance (using the 'noeviction' policy). 554 # 555 # WARNING: If you have replicas attached to an instance with maxmemory on, 556 # the size of the output buffers needed to feed the replicas are subtracted 557 # from the used memory count, so that network problems / resyncs will 558 # not trigger a loop where keys are evicted, and in turn the output 559 # buffer of replicas is full with DELs of keys evicted triggering the deletion 560 # of more keys, and so forth until the database is completely emptied. 561 # 562 # In short... if you have replicas attached it is suggested that you set a lower 563 # limit for maxmemory so that there is some free RAM on the system for replica 564 # output buffers (but this is not needed if the policy is 'noeviction'). 将内存使用限制设置为指定的字节。当已达到内存限制Redis将根据所选的逐出策略(请参阅maxmemory策略)尝试删除数据。 如果Redis无法根据逐出策略移除密钥,或者策略设置为“noeviction”,Redis将开始对使用更多内存的命令(如set、LPUSH等)进行错误回复,并将继续回复只读命令,如GET。 当将Redis用作LRU或LFU缓存或设置实例的硬内存限制(使用“noeviction”策略)时,此选项通常很有用。 警告:如果将副本附加到启用maxmemory的实例,则将从已用内存计数中减去馈送副本所需的输出缓冲区的大小,这样,网络问题/重新同步将不会触发收回密钥的循环,而副本的输出缓冲区将充满收回的密钥增量,从而触发删除更多键,依此类推,直到数据库完全清空。 简而言之。。。如果附加了副本,建议您设置maxmemory的下限,以便系统上有一些空闲RAM用于副本输出缓冲区(但如果策略为“noeviction”,则不需要此限制)。 驱逐策略的配置 Maxmemery-policy volatile-lru

当前已用内存超过 maxmemory 限定时,触发主动清理策略

易失数据清理

volatile-lru:只对设置了过期时间的key进行LRU(默认值)

volatile-random:随机删除即将过期key

volatile-ttl : 删除即将过期的

volatile-lfu:挑选最近使用次数最少的数据淘汰

全部数据清理

allkeys-lru : 删除lru算法的key

allkeys-lfu:挑选最近使用次数最少的数据淘汰

allkeys-random:随机删除

禁止驱逐

(Redis 4.0 默认策略)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsdxz.html