文章

Redis 有哪几种数据“淘汰”策略?

Redis 有哪几种数据“淘汰”策略?

Redis 内存数据集大小上升到一定大小的时候,就会进行数据淘汰策略。

Redis 提供了 6 种数据淘汰策略:

  • volatile-lru
  • volatile-ttl
  • volatile-random
  • allkeys-lru
  • allkeys-random
  • 【默认策略】no-enviction

具体的每种数据淘汰策略的定义,和如何选择讨论策略,可见 《Redis实战(二) 内存淘汰机制》 。

在 Redis 4.0 后,基于 LFU(Least Frequently Used)最近最少使用算法,增加了 2 种淘汰策略:

  • volatile-lfu
  • allkeys-lfu

🦅 Redis LRU 算法

另外,Redis 的 LRU 算法,并不是一个严格的 LRU 实现。这意味着 Redis 不能选择最佳候选键来回收,也就是最久未被访问的那些键。相反,Redis 会尝试执行一个近似的 LRU 算法,通过采样一小部分键,然后在采样键中回收最适合(拥有最久未被访问时间)的那个。

Redis 没有使用真正实现严格的 LRU 算是的原因是,因为消耗更多的内存。然而对于使用 Redis 的应用来说,使用近似的 LRU 算法,事实上是等价的。

具体的可以看看如下文章:

🦅 MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?

艿艿:这个是从网络上找到的一个神奇的问题,并且看了答案之后,觉得有点莫名的对不上。

所以,感觉这个问题的目的是,如何保证热点数据不要被淘汰。

「Redis 有哪几种数据“淘汰”策略?」 问题中,我们已经看到,“Redis 内存数据集大小上升到一定 maxmemory 的时候,就会进行数据淘汰策略。” 。

那么,如果我们此时要保证热点数据不被淘汰,那么需要选择 volatile-lru 或 allkeys-lru 这两个基于 LRU 算法的淘汰策略。

相比较来说,最终会选择 allkeys-lru 淘汰策略。原因是,如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择 allkeys-lru 策略。如果在 Redis 4.0 版本,可以考虑使用 volatile-lfu ,更加符合“热”的概念,频率越高,代表越热。

🦅 Redis 回收进程如何工作的?

理解回收进程如何工作是非常重要的:

  • 一个客户端运行了新的写命令,添加了新的数据。
  • Redis 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。
  • Redis 执行新命令。

所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下(跌宕起伏)。

本文由作者按照 CC BY 4.0 进行授权