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

一. Redis为什么需要有过期策略和内存淘汰机制

大家都知道Redis是一个缓存中间件其存取都是在内存中所以速度读写的速度是非常快的,而一台机器的内存是非常宝贵的能够分配给Redis的内存也是非常有限的,假如给Redis分配了10G的内存而我需要往里面写20G的数据那么多出来10G的数据怎么办呢?还有的数据明明就过期了但是还是占用了内存,这个时候Redis的过期策略和内存淘汰机制的价值就可以提现出来了.

二. Redis的过期策略

Redis的过期策略是定期删除和惰性删除相结合的.
定期删除:
Redis会默认每隔100ms就随机的抽取一些设置了过期时间的key进行检测,如果过期了就删除.
惰性删除: 获取通过key在Redis中获取数据的时候会先判断key是否过期,如果过期了就删除key不返回任何数据.
但是这样子存在一个问题,那就是定期删除和惰性删除都是没办法检查到每一个key的,这样子还是会有大量的key过期了但是数据还没有被删除的现象.这个该如何处理呢?那么该是内存淘汰机制出马的时候了.

三. Redis的内存淘汰机制

如下图:
Redis的过期策略和内存淘汰机制
当时候设置时Redis的内存淘汰机制默认是: no-eviction.
总结点:

  • volatile为前缀的策略都是从已过期的数据中进行淘汰
  • allkeys为前缀的策略都是面向所有key进行淘汰的
  • LRU(least recently used) 表示最近最少用到的
  • LFU(least frequently used) 最不常用到的.
  • 以上所有的淘汰机制都是当Redis使用的内存达到阈值的时候才会触发的.