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。