Redis的过期策略和内存淘汰策略

09
五月
2021

什么是过期策略?
    在redis中我们对于键可以通过expire key time设置生存时间,当time时间过后键就会过期,redis会采用过期策略对过期的键进行删除。
过期策略基于什么考虑?
    过期策略主要是在cpu和内存之间进行权衡。可以将cpu的处理效率作为侧重点进行选择策略,也可以将内存的容量作为侧重点进行选择策略

有哪些过期策略?
一,定时删除(基于内存考虑的策略):在设置键的过期时间时,同时设置一个定时器,在键的过期时间即将来临时,立即执行对键的删除。
优点:对内存来说时有利的。当键即将过期时,马上就删除了这个键,并释放其占用的内存。
缺点:对cpu来说是不友好的。由于redis是单线程的,如果在某个时间大量的键需要马上删除,这就会极大的消耗cpu时间来处理这些过期键,当客户端有很多请求来临时,就会造成请求迟迟得不到处理甚至发生连接过期。
二,惰性删除(基于cpu考虑的策略):设置了过期时间的键,只有在取出键时,才会判断其是不是过期的。
优点:对cpu来说是友好的。cpu不必花时间在删除过期键这种事情上,除非当取出过期键时才会。
缺点:对内存来说是不友好的。当内存中的过期键如果一直不访问,则永远也不会进行处理,这会造成内存越来越大,就相当内存泄漏了。
三,定期删除(折中cpu和内存的策略):通过每隔一段时间进行过期键的删除操作(基于内存),同时限制每次删除操作的时间和频率来减少对cpu的影响(基于cpu)。
难点:对于间隔时间的选择和执行时间的选择。
如果间隔时间设置太小就退化成了定时删除,如果间隔时间设置太长就退化成了惰性删除。
如果执行时间太小就退化成了惰性删除,如果执行时间太长就退化成了定时删除。
因此redis实际采用的过期删除间隔时间为100ms进行检查是否有过期的键。同时检查不是针对所有key(否则太耗时间),而是随机抽取20个进行检查。
优点:能比较中和的基于cpu和内存进行删除。
缺点:由于检查时是随机抽查,所以可能很多过期键没有被抽查到,导致过期键越来越多,内存越来越大。

Redis清除过期Key的方式

定期删除+惰性删除

 

为什么要使用内存淘汰策略?

由于过期删除采用的随机抽查,不可能将所有过期键找到并删除,如果这时这些过期键也没被惰性删除检查到就会导致内存越来越大,所以此时需要使用内存淘汰策略。

Redis配置文件中可以设置maxmemory,内存的最大使用量,到达限度时会执行内存淘汰机制

Redis中的内存淘汰机制:

没有配置时,默认为no-eviction

名称    描述
volatile-lru    从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-lfu    从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
volatile-ttl    从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random    从已设置过期时间的数据集中挑选任意数据淘汰
allkeys-lru    当内存不足写入新数据时淘汰最近最少使用的Key
allkeys-random    当内存不足写入新数据时随机选择key淘汰
allkeys-lfu    当内存不足写入新数据时移除最不经常使用的Key
no-eviction    当内存不足写入新数据时,写入操作会报错,同时不删除数据


volatile为前缀的策略都是从已过期的数据集中进行淘汰。
allkeys为前缀的策略都是面向所有key进行淘汰。
LRU(least recently used)最近最少用到的。
LFU(Least Frequently Used)最不常用的。
它们的触发条件都是Redis使用的内存达到阈值时。

TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员