您的位置:首页 > 数据库 > Redis

redis的maxmemory设置以及淘汰策略介绍

2017-02-21 10:17 686 查看
转载地址:http://www.2cto.com/database/201507/420889.html

redis的maxmemory参数用于控制redis可使用的最大内存容量。如果超过maxmemory的值,就会动用淘汰策略来处理expaire字典中的键。

关于redis的淘汰策略:

Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:

· noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。

· allkeys-lru:在主键空间中,优先移除最近未使用的key。

· volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。

· allkeys-random:在主键空间中,随机移除某个key。

· volatile-random:在设置了过期时间的键空间中,随机移除某个key。

· volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

PS:



关于maxmemory的设置,如果redis的应用场景是作为db使用,那不要设置这个选项,因为db是不能容忍丢失数据的。

如果作为cache使用,则可以启用这个选项(其实既然有淘汰策略,那就是cache了。。。)

但是在集群环境下(尤其是有多个slavers的情形),maxmeomory的值并不是实际redis使用的内存,这个选项值并没有包括slaver的output buffer。

redis早期版本出过一个bug,在多个slaver的情形下,设置了maxmemory值,同时设定了淘汰策略,会造成master上的数据被渐渐擦除。

antirez先生给出了这个问题的原因:

简单说来,删除过期键,需要产生del命令发送给slaver,如果slaver足够多,output buffer将会占用足够多的内存,导致更多的键过期,如此往复,陷入了无线循环。

解决方案有多种,比如output buffer可以不计入maxmemory。

因此,在3.0版本的配置说明中有了以下表述:

由此可见,如果有slaver的情况下,建议适当调低maxmemory,给output buffer留出一定的可用空间是合理的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: