1、首先,谈一下个人的理解。清除过期数据、缓存淘汰策略是两个方面的意思。
清除过期数据有三种策略:分别是定时删除、定期删除、惰性删除,并且分别基于定时器、hz参数的定期检查、查询过期key的时间节点,作为是否清除数据的动作触发点。
缓存淘汰策略:是基于redis占用内存是否达到设定的限制值,作为是否清除数据的动作触发点。
可以说redis,平时基于清除数据的策略来清除过期的数据,因为前者触发条件容易满足,执行的频率高;而后者要达到redis设置的限制值,需要时间和一系列清除策略的误差,才会被慢慢放大,最终达到限制内存的临界点。试想假定redis的内存限制是50G,基本不可能在短时间内redis内存使用率就达到临界值。
2、数据过期清除策略
- 2.1 定时删除
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 - 2.2 定期删除
redis会定期执行清理过期key的任务,运行频率由redis.conf中的hz参数决定,取值范围1~500,默认是10,代表每秒运行10次。
清理过程如下:
1)遍历所有的db
2)从db中设置了过期时间的key的集合中随机检查20个key
3)删除检查中发现的所有过期key
4)如果检查结果中25%以上的key已过期,则继续重复执行步骤2-3,否则继续遍历下一个db
调大hz将会提高redis定期任务的执行频率,如果redis中包含很多过期key的话,可以考虑将这个值调大,但要注意同时也会增加CPU的压力,redis作者建议这个值不要超过100。
- 2.3 惰性删除
定期删除可能导致很多过期的key 到了时间并没有被删除掉。这时就要使用到惰性删除。在你获取某个key的时候,Redis会检查一下,这个key如果设置了过期时间并且过期了,是的话就删除。
3、缓存淘汰策略
- noeviction:内存不足以写入新数据的时候会直接报错。
- allKeys-lru:内存不足以写入新数据时候,移除最近最少使用的key。
- allKeys-random: 内存不足以写入新数据时,随机移除key。
- volatile-lru: 内存不足以写入新数据时,在设置了过期时间的key当中移除最近最少使用的key。
- volatile-random: 内存不足以写入新数据时,在设置了过期时间的key中,随即移除key。
- volatile-ttl: 内存不足以写入新数据时,在设置了过期时间的key当中移除最先过期的key。
通常情况下推荐优先使用 allkeys-lru 策略。这样可以充分利用 LRU 这一经典缓存算法的优势,把最近最常访问的数据留在缓存中,提升应用的访问性能。
allkeys-lru:有明显的冷热数据
allkeys-random:无明显的冷热数据。
如果没有设置过期时间的键值对,那么 volatile-lru,volatile-lfu,volatile-random 和 volatile-ttl 策略的行为, 和 noeviction 基本上一致。
相关配置示范如下:
grep -E 'memory|hz' redis_6385/conf/redis.conf
maxmemory 20gb
maxmemory-policy allkeys-lru
maxmemory-samples 3
hz 50
maxmemory-samples:代表每次随机取样的个数是3。