Redis淘汰策略(5.0版本)

  1. volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。

  2. volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。

  3. volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。

  4. volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。

  5. allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

  6. allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。

  7. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  8. no-enviction(驱逐):禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失。

淘汰机制的实现:

删除失效主键

  1. 消极方法:

在主键被访问时如果发现它已经失效,那么就删除它。redis在实现GET、MGET、HGET、LRANGE等所有涉及到读取数据的命令时都会调用 expireIfNeeded,它存在的意义就是在读取数据之前先检查一下它有没有失效,如果失效了就删除它。

Redis淘汰策略(5.0版本)
Redis淘汰策略(5.0版本)

expireIfNeeded函数中调用的另外一个函数propagateExpire,这个函数用来在正式删除失效主键,并且广播告诉其他地方,目的地有俩:AOF文件,将删除失效主键的这一操作以DEL Key的标准命令格式记录下来;另一个就是发送到当前Redis服务器的所有Slave,同样将删除失效主键的这一操作以DEL Key的标准命令格式告知这些Slave删除各自的失效主键。

  1. 积极方法:

周期性地探测,发现失效就删除。消极方法的缺点是,如果key 迟迟不被访问,就会占用很多内存空间,所以才有积极方式。

  1. 主动删除:

当内存超过maxmemory限定时,触发主动清理策略,该策略由启动参数的配置决定

Redis淘汰策略(5.0版本)