Redis过期与内存淘汰机制

Redis数据过期

我们知道Redis中的key可以设置过期时间,如果设置1批key只能存活1分钟,那么1分钟后,Redis是怎么对这批key进行删除的呢?

常用过期策略有三种:

  • 定时过期:每个设置过期时间的key都创建一个定时器,到期后立即清除。
    • 优点:到期后立即清除数据,对内存友好。
    • 缺点:创建大量定时器,占用过多系统资源,对CPU不友好。
  • 惰性过期:取出key的时候对数据过期时间进行检查。
    • 优点:对CPU友好。
    • 缺点:造成太多过期key没有删除,对内存不友好。
  • 定期过期:每隔一段时间抽取一批key执行删除过期key操作,可以看做是定时和惰性的一种折中方案。

在Redis中同时使用了定期删除+惰性删除

Redis内存淘汰机制

Redis中的过期策略可能漏掉很多过期key没被清除,导致内存溢出。当用于缓存的内存不足时,Redis提供了6种内存淘汰机制(后面两种是4.0版本后增加的):

  1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
  4. allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
  6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧。
  7. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰。
  8. allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key。

注:注意区分LRU和LFU,LRU指淘汰最长时间没被使用的,LFU指淘汰一段时间内使用次数最少的。

参考资料

  1. https://javaguide.cn/database/redis/redis-questions-01
  2. https://www.cnblogs.com/sddai/p/9739900.html
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信