当Redis内存达到maxmemory后,每次写入新的数据之前,Redis必须先从实例中踢出一部分数据,让整个实例的内存维持在maxmemory之下,然后才能把新数据写进来。
这个踢出旧数据的逻辑也是需要消耗时间的,而具体耗时的长短,要取决于你配置的淘汰策略:
•allkeys-lru:不管key是否设置了过期,淘汰最近最少访问的key; •volatile-lru:只淘汰最近最少访问、并设置了过期时间的key; •allkeys-random:不管key是否设置了过期,随机淘汰key; •volatile-random:只随机淘汰设置了过期时间的key; •allkeys-ttl:不管key是否设置了过期,淘汰即将过期的key; •noeviction:不淘汰任何key,实例内存达到maxmeory后,再写入新数据直接返回错误; •allkeys-lfu:不管key是否设置了过期,淘汰访问频率最低的key(4.0+版本支持); •volatile-lfu:只淘汰访问频率最低、并设置了过期时间key(4.0+版本支持)。
一般最常使用的是allkeys-lru/volatile-lru淘汰策略,它们的处理逻辑是,每次从实例中随机取出一批key(这个数量可配置),然后淘汰一个最少访问的key,之后把剩下的key暂存到一个池子中,继续随机取一批key,并与之前池子中的key比较,再淘汰一个最少访问的key。以此往复,直到实例内存降到maxmemory之下。
需要注意的是,Redis的淘汰数据的逻辑与删除过期key的一样,也是在命令真正执行之前执行的,也就是说它也会增加我们操作Redis的延迟,而且,写OPS越高,延迟也会越明显。以上内容摘自《阿里开发者手册-Redis专题》电子书,点击https://developer.aliyun.com/ebook/download/7770 可下载完整版
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。