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 执行新命令。
所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下(跌宕起伏)。