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策略从而更有效率的使用内存。

posted on 2019-06-01 16:36  希望者  阅读(583)  评论(0编辑  收藏  举报

导航