Redis的缓存过期策略通常有三种:
一、定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。
优点:该策略可以立即清除过期的数据,对内存很友好;
缺点:若过期key很多,删除这些key会会占用大量的CPU资源去处理过期的数据,从而影响性能。
二、 惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。
优点:该策略可以最大化地节省CPU资源:删除操作只发生在取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
缺点:对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存,甚至导致内存泄漏。
三、定期过期
每隔一定的时间,会扫描一定数量的的key,并清除其中已过期的key。
该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
Redis的内存淘汰策略
如果redis占用内存过多的时候,此时会进行内存淘汰,有如下一些策略:
-
noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键
-
allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
-
volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
-
allkeys-random:加入键的时候如果过限,从所有key随机删除
-
volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
-
volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
-
volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
-
allkeys-lfu:从所有键中驱逐使用频率最少的键