我们如果想让Redis作为缓存服务器的话,通常有两种方案:

一:设置过期时间,expire key seconds。

二:设置一个内存阀值,基于某种策略自动的缓存淘汰。

maxmemory100mb
maxmemory-policyallkeys-lru
maxmemory-samples5

这两种方式有什么不同呢?设置过期时间是人为主观控制的,设置key值的时候每次都要设置下过期时间,比较繁琐,另外Redis为了维护过期时间需要使用更多的内存。我们知道80%的请求往往会落脚在20%的数据身上,即“二八定律”,当我们想缓存这20%的热数据的时候,有没有一个更好的策略来进行缓存呢?就是通过第二种方式,设置一个最大阀值,如果超过内存的阀值,那么Redis就会基于你设置的策略进行缓存淘汰。很明显,第二种方式更“智能”。

第二种方式给出的三个配置项可以有两种设置方式:

一:在redis.conf文件中配置,开发测试环境中,我们通常不会去修改这个配置文件,因此redis启动的时候是以默认配置启动的。官方提供了完整的配置用法说明:

传送门redis.conffor Redis3.0

三个配置项详细说明:

1.maxmemory<bytes>:内存阀值,超过阀值,redis就会根据maxmemory-policy的策略进行缓存淘汰。如果策略配置的是noeviction,到达内存阀值的时候如果继续执行写入命令,此时Redis会返回errors。另外官方给出的建议如果你的Redis有Slave从节点的话,maxmemory最好设置相对小一些,因为slave输出buffers需要额外的内存开销。

2.maxmemory-policy:达到内存阀值时缓存淘汰的策略。在讲策略之前,我们需要先来了解一个名词:LRU,它是Least Recently Used的缩写,即近期最少使用算法,大名鼎鼎的memcached采取的缓存算法也是LRU,比如有一组数据7,0,7,3,2,0,我们的阀值设置为3,那么采用LRU的算法最后会保留哪几个?

第一步:7

第二步:07

第三步:70(7被激活)

第四步:37 0

第五步:23 7 (0被淘汰)

第六步:02 3 (7被淘汰)

言归正传,maxmemory-policy一共有6种策略:

a.volatile-lru:通过LRU算法移除过期时间集合中的key。

b.allkeys-lru:通过LRU算法移除任意的key。

c.volatile-random:随机移除过期时间集合中的key。

d.allkeys-random:随机移除一个key。

e.volatile-ttl:移除即将要过期的key。

f.noeviction:不淘汰任何一个key,如果继续有写入操作,返回errors。

3.maxmemory-samples

redis的优先级 redis中lru的优化_redis的优先级

图中的浅灰色表示被淘汰的数据,灰色表示缓存中的数据,墨绿色表示新添加到缓存中的数据,理论中的LRU应该是图一所示,图二和图四对比可以发现Redis3.0中采样为10的时候更接近于图一中理论上的LRU效果,而图三和图四对比发现Redis3.0相比于Redis2.8的LRU算法有了不小的优化改进。

二:通过configset动态设置:

在配置文件中设置,我们需要重新启动Redis,有没有一种办法可以在Redis运行时动态更改配置呢,config set可以实现,confit set maxmemory 100mb。

在“读多写少”的场景下,不管是本地缓存还是分布式缓存对于大型应用的性能和可靠性都起到了至关重要的作用,考虑到内存的成本以及上文提到的“二八定律”,在Redis出色的性能下LRU缓存淘汰机制是一个不错的选择。