Redis 内存淘汰机制

Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况。Redis最常见的两种应用场景为缓存和持久存储,首先要明确的一个问题是内存淘汰策略更适合于那种场景?是持久存储还是缓存?

内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。

首先要配置maxmemory值

1.客户端发起了需要申请更多内存的命令(如set)。

2.Redis检查内存使用情况,如果已使用的内存大于maxmemory则开始根据用户配置的不同淘汰策略来淘汰内存(key),从而换取一定的内存。

3.如果上面都没问题,则这个命令执行成功。

maxmemory为0的时候表示我们对Redis的内存使用没有限制。

Redis提供了下面几种淘汰策略

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错

设置方式   

config set maxmemory-policy volatile-lru

试验总结:

1,版本不同,默认的策略不同

在2.8.13的版本里,默认是noeviction,在3.2.3版本里默认是volatile-lru

2,volatile-lru、volatile-ttl、volatile-random这几种只对设置了过期时间的key有效,不会淘汰没有设置过期时间的key

3,与是否设置持久化无关

4,测试volatile-lru测量,在插入有过期时间的key时,如果达到了maxmemory值,就会对老的key进行淘汰,插入新值

5,如果设置为noeviction或者key没有过期时间,当达到最大内存值时就会直接报错

下面看看几种策略的适用场景:

·         allkeys-lru:如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。

·         allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

·         volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。

    原文作者:yjwlyy
    原文地址: https://www.jianshu.com/p/ad8f35c2c0d0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞