Redis——数据淘汰策略
文章目录
- 1. 引入
- 2. 讲解
- 2.1 Redis 中的 8 种数据淘汰策略
- 2.2 LRU 和 LFU 算法
- 2.3 建议
- 3. 总结
1. 引入
在 Redis——数据过期策略 的“引入”部分讲解过,Redis 的数据存在内存中,而内存容量相对较小,不能将大量数据 无限期 地缓存。然而,对于有些场景,例如 缓存击穿 的解决方案二——逻辑过期,需要将一部分数据 “无限期” 地缓存到 Redis 中;或者在某一时间段内,海量查询请求使得大量数据缓存到 Redis 中。
那么当缓存的数据越来越多,直至 Redis 的最大内存限制时,Redis 会如何应对呢?这就涉及到本文要讲的 数据淘汰策略 (缓存淘汰策略),即 Redis 在内存达到最大限制时,为了释放空间,选择键删除的方式。
2. 讲解
2.1 Redis 中的 8 种数据淘汰策略
Redis 的数据淘汰策略共有 8 种:
noeviction
:不淘汰任何键,内存达到最大限制后不允许写入新数据,是 默认策略。volatile-ttl
:对设置了 TTL (Time-to-Live,过期时间) 的键,比较键的剩余 TTL 值,TTL 越小的值,越先淘汰。allkeys-random
:对于所有键,随机选择并淘汰。volatile-random
:对于设置了 TTL 的键,随机选择并淘汰。allkeys-lru
:对于所有键,基于 LRU 算法进行淘汰。volatile-lru
:对于设置了 TTL 的键,基于 LRU 算法进行淘汰。allkeys-lfu
:对于所有键,基于 LFU 算法进行淘汰。volatile-lfu
:对于设置了 TTL 的键,基于 LFU 算法进行淘汰。
在 Redis 的 redis.conf
配置文件中,配置方式如下:
maxmemory-policy allkeys-lru # 使用 对所有键按 LRU 淘汰 的策略
2.2 LRU 和 LFU 算法
- LRU (Least Recently Used,最近最少使用):重点关注数据的 使用时间,淘汰 最久未使用 的数据。假如三个键
name, age, weight
从前到后依次缓存到 Redis 中,并且使用的顺序为age -> name -> weight -> name
,如果需要基于 LRU 淘汰,则淘汰的优先级是age > weight > name
。 - LFU (Least Frequently Used,最少频率使用):重点关注数据的 使用频率,淘汰 使用频率最低 的数据。
2.3 建议
- 一般情况下,使用
allkeys-lru
策略,把 最近最常用 的数据留在缓存中。因为大部分情况下,数据都是有 冷热 之分的,也就说有些数据 访问频率 高,有些低;然而 很久之前的 访问频率高的 数据再被访问的可能性不大,所以不需要缓存很久之前的数据。综上所述,一般情况适合使用allkeys-lru
策略。
3. 总结
当 Redis 的内存达到最大限制时,Redis 会根据指定数据淘汰策略,选择一些数据进行淘汰。其中,需要重点理解 LRU (淘汰最久未使用的数据) 和 LFU (淘汰使用频率最低的数据) 这两种算法。在生产中,建议使用 allkeys-lru
这种数据淘汰策略,保存 最近最常用 的数据。