Redis 淘汰策略解读

摘要:

      Redis 在生产环境中,采用配置参数 maxmemory 的方式来限制内存的大小。当实际存储内存超过 maxmemory 参数值时,开发者可以通过 Redis 内存淘汰策略,来决定如何腾出新空间继续支持读写工作。

工作情况

       首先,客户端会发起需要更多内存的申请;其次,Redis 检查内存使用情况,如果实际使用内存已经超出 maxmemory, Redis 会根据用户配置的淘汰策略选出无用的 Key,执行淘汰任务。

淘汰策略

volatile-lru

从过期时间的数据集(server.db[i].expires)中挑选出最近最少使用的数据淘汰。没有设置过期时间的 key 不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。

volatile-ttl

除了淘汰机制不同,策略上基本与 volatile-lru 相似,从设置过期时间的数据集(server.db[i].expires) 中挑选将要过期的数据淘汰,ttl 值越小,越容易被淘汰。

volatile-random

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

allkeys-lru

从数据集(server.db[i].dict) 中挑选最近最少使用的数据淘汰,该策略要淘汰的 key 面向的是全体 Key 集合,而非过期的 Key 集合 

allkeys-random

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

no-enviction

禁止驱逐数据,也就是当内存不足以容纳新入数据时,新写入操作就会报错,采用该策略可以保证数据不被丢失,也是系统默认的一种淘汰策略。

注意:在Redis中,LRU算法是一个近似算法,默认情况下,Redis会随机挑选5个键,并从中选择一个最久未使用的key进行淘汰。在配置文件中,按maxmemory-samples选项进行配置,选项配置越大,消耗时间就越长,但结构也就越精准。

参考资料:

https://stor.51cto.com/art/201904/594773.htm

https://wiki.jikexueyuan.com/project/redis/data-elimination-mechanism.html

原文地址:https://www.cnblogs.com/zpcoding/p/12513364.html