Redis是内存型数据库,而我们知道内存资源是有限的,围绕更好的利用内存,下面来了解一下Redis的过期删除策略和内存淘汰策略。

过期删除策略

过期删除策略主要围绕CPU和内存的讨论,期望得到对CPU和内存都友好的过期删除策略方案。

过期删除策略种类

过期删除策略有三种:定时删除、惰性删除、定期删除。

  1. 定时删除:在为key设置过期时间的同时,创建对应定时器,等定时器计时结束删除该key。

    • 优点:key过期即删除,对内存友好。

    • 缺点:若有大量key删除,将消耗大量CPU资源,假如CPU资源紧张,会影响响应时间和吞吐量。

  2. 惰性删除:不主动检测过期key,而是每次访问key时判断key是否过期,如果过期再删除。

    • 优点:相比方案1,更节省CPU资源
    • 缺点:同一时刻可能有大量过期key占用内存空间,可能会存在过期key永不被删除的情况。
  3. 定期删除:设置间隔时间(如200 ms),每隔一段时间随机检测key是否过期,如果检测到过期key即删除。

    • 优点:如果间隔设置合理,一定时间上节省CPU和内存。
    • 缺点:间隔时间不好把控
      1. 如果间隔时间设置过短,会造成大量CPU资源占用。
      2. 如果间隔时间设置过长,会造成大量过期key占用内存。

Redis的过期删除策略

Redis结合了惰性删除和定期删除的优点,将两种策略结合使用,一定程度上平衡了内存占用与CPU占用。

但是Redis的过期删除策略不能保证过期key一定能删除,所以还会面临内存爆满的情况,这个时候就需要内存淘汰机制了。

Redis内存淘汰机制

内存爆满时,需要内存淘汰机制淘汰key,得到空闲内存以继续工作。

Redis的内存淘汰机制有8种:

  1. volatile-ttl :选择将要过期的key进行淘汰。
  2. volatile-lfu(Redis 4.0 之后,新增的内存淘汰机制):在有设置过期时间的key中选择最不经常访问的key进行淘汰。
  3. volatile-lru:在有设置过期时间的key中选择最久未使用的key进行淘汰。
  4. volatile-random:在有设置过期时间的key中随机选择key进行淘汰。
  5. always-lfu(Redis 4.0 之后,新增的内存淘汰机制):在所有key中选择最不经常访问的key进行淘汰。
  6. always-lru(Redis 3.0 之前,默认的内存淘汰机制):在所有key中选择最久未使用的key进行淘汰。
  7. always-random:在所有key中随机选择key进行淘汰。
  8. noeviction(Redis 3.0 之后,默认的内存淘汰机制):不淘汰任何key,是返回错误信息。

参考文献

  1. CSDN:redis - 过期策略和淘汰机制

  2. 拓跋阿秀的学习笔记:定期和惰性一定能保证删除数据吗?如果不能,Redis会有什么应对措施?

  3. 小林coding: Redis 过期删除策略和内存淘汰策略有什么区别?

Categories:

Tags:

还没发表评论,快来发表第一个评论吧~

发表回复