Redis的键删除机制与内存淘汰策略

键删除机制

  • 定时删除

定时器监视key,如果键过期了,则直接执行删除
优点:对内存友好,可以及时删除过期键避免占用内存
缺点:对CPU不友好,在处理高并发请求时,CPU应该尽量处理请求而不是删除过期键

  • 惰性删除

每次获取键时,判断是不是过期了,如果过期了就执行删除
优点:对CPU友好
缺点:对内存不友好,过期键不会及时删除,占用内存

  • 定期删除

每100ms随机抽取检查是否有过期的key,有过期的key则删除。
优点:同时节省CPU和内存
缺点:会导致很多key到时间没有删除,也就是使用定时删除会导致删除不完全

Redis是采用定期删除+惰性删除策略

内存淘汰策略

内存淘汰机制就能保证在redis内存占用过高的时候,进行内存淘汰,也就是删除一部分key,保证redis的内存占用率不会过高。

Redis6.0.x版本的配置文件关于内存淘汰的说明:

image-1663393996875


翻译成中文就是

#MAXMEMORY策略:当达到MAXMEMORY时,Redis将如何选择要删除的内容。您可以从以下行为中选择一种:

  • volatile-lru-> 从设置了过期时间的key中使用LRU算法,选出最近使用最少的数据淘汰。
  • allkeys lru-> 从所有key中使用LRU算法,选出最近使用最少的数据淘汰。
  • volatile-lfu-> 从设置了过期时间的key中使用LFU算法,选出使频率最低的数据淘汰。
  • allkeys-lfu-> 从所有key中使用LFU算法,选出使频率最低的数据淘汰。
  • volatile-random-> 从设置了过期时间的key中,随机选出数据淘汰。
  • allkeys-random-> 从所有的key中,随机选出数据淘汰。
  • volatile-ttl-> 从设置了过期时间的key中,选出即将过期的数据淘汰。
  • noeviction-> 禁止淘汰数据,写入操作报错。

LRU表示最近使用的最少
LFU表示使用频率最低

LRU、LFU和volatile-ttl均使用近似随机算法实现。

注意:对于上述任何策略,当没有合适的键进行逐出时,Redis将在写操作时返回错误。

默认值为:maxmemory策略无受害者


前缀为volatile-和allkeys-的区别在于二者选择要清除的键时的字典不同:

  • volatile-前缀的策略代表从redisDb中的expire字典(过期字典)中选择键进行清除;
  • allkeys-开头的策略代表从dict字典中选择键进行清除;
# Redis 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×