redis是将数据存放在内存里的,内存是有限的且有的业务场景也需要将数据设置为过期,所以就有了过期删除策略与淘汰策略。
过期删除策略分了定时删除、惰性删除与定期删除三种:
image.png
这里说一下定时与定期的主要差别:定时会扫描全部的键如果过期进行删除;而定期并不会扫描全部键,而是有一定的算法只是对其中一部分键进行删除。

通过三种删除策略的比较,惰性删除+定期删除结合可以一定程度上避免内存的无效占用,但也不可能完全避免,假设一下:如果某些键一直没被扫描到也没被使用,那它就会逃脱定期与惰性删除使得内存还是得不到释放,这样,我们就需要设置淘汰策略了。

当redis内存使用达到我们设置的maxmemory后,会根据淘汰策略清理内存,淘汰策略一有下面八种:

  1. noeviction 当内存不足以容纳写入数据时,新写入操作会报错。
  2. allkeys-lru 当内存不足以容纳写入数据时,移除最近最少使用的key。
  3. allkeys-random 当内存不足以容纳写入数据时,随机移除某个key。
  4. volatile-lru 当内存不足以容纳写入数据时,移除设置了过期时间里最近最少使用的key。
  5. volatile-random 当内存不足以容纳写入数据时,随机移除设置了过期时间的key。
  6. volatile-ttl 当内存不足以容纳写入数据时,优先移除更早过期时间的key。
  7. allkeys-lfu(Redis 4.0 以上),针对所有 Key,优先删除最少使用的 Key;
  8. volatile-lfu(Redis 4.0 以上),针对带有过期时间的 Key,优先删除最少使用的 Key。

有两点需要说明下:

  • 一般不推荐使用random相关的淘汰策略,一些数据莫明其妙的不见给人造成困惑。不过也没有绝对,需要结合业务场景。
  • 如果没设置过期时间,那volatile-lru/volatile-random/volatile-ttl的行为与noeviction差不多。

步履不停
38 声望13 粉丝

好走的都是下坡路