redis(8)、过期策略和淘汰策略
一、redis的过期策略
Redis 的过期策略,就是指当 Redis 中缓存的 key 过期了,Redis 如何处理。
Redis 提供了 3 种数据过期策略:
被动删除:当读/写一个已经过期的 key 时,会触发惰性删除策略,直接删除掉这个过期 key 。
主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以 Redis 会定期主动淘汰一批已过期的 key 。
主动删除:当前已用内存超过 maxmemory 限定时,触发主动清理策略,即 「数据“淘汰”策略」 。
在 Redis 中,同时使用了上述 3 种策略,即它们非互斥的。
二、redis的淘汰策略
Redis 内存数据集大小上升到一定大小的时候,就会进行数据淘汰策略。
Redis 提供了 6 种数据淘汰策略:
1. volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
2. volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
3. volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
4. allkeys-lru:从数据集中挑选最近最少使用的数据淘汰。
5. allkeys-random:从数据集中任意选择数据淘汰,当内存达到限制的时候,对所有数据集挑选随机淘汰,可写入新的数据集。
6. no-enviction:当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。
具体的每种数据淘汰策略的定义,和如何选择讨论策略,可见 《Redis实战(二) 内存淘汰机制》 。
如何配置:
我们通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能。
# maxmemory
值得注意的是,maxmemory为0的时候表示我们对Redis的内存使用没有限制。
根据应用场景,选择淘汰策略
# maxmemory-policy noeviction
设置最大内存
config set maxmemory 100000
设置淘汰策略
config set maxmemory-policy noeviction
三、如何选择淘汰策略
下面看看几种策略的适用场景
allkeys-lru:如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。
allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。
另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。