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