缓存淘汰策略
理解内存淘汰的触发场景
掌握 8 种淘汰策略的区别
能根据业务场景选择合适的策略
核心讲解
当 Redis 内存使用达到maxmemory上限时,会触发淘汰机制,删掉一部分 key,保证继续运行。
(1)触发条件
配置maxmemory,达到上限就触发淘汰。
不配置:32 位系统 3GB,64 位系统不限制
生产环境建议配置,防止用爆系统内存
(2)8 种淘汰策略
表格
策略 | 说明 |
|---|---|
| 不淘汰,新写入报错,默认策略 |
| 所有 key 中,淘汰最近最少使用的(LRU) |
| 所有 key 中,淘汰使用频率最低的(LFU) |
| 所有 key 中,随机淘汰 |
| 有过期时间的 key 中,淘汰 LRU |
| 有过期时间的 key 中,淘汰 LFU |
| 有过期时间的 key 中,随机淘汰 |
| 有过期时间的 key 中,淘汰剩余时间最短的 |
(3)核心概念
LRU:最近最少使用,按最后访问时间,淘汰很久没访问的
LFU:最少使用频率,按访问次数,淘汰用得少的,Redis 4.0 + 支持
allkeys:所有 key 都参与淘汰
volatile:只淘汰设置了过期时间的 key
(4)选择建议
大多数场景推荐:
allkeys-lru,热点数据留着,冷的淘汰有明确冷热区分:
allkeys-lfu,访问频率差异大的场景数据不能删:
noeviction,宁愿报错也不删所有数据都有过期:
volatile-lru数据平等,随机就行:
allkeys-random
操作示例
配置文件:
# 最大内存,比如2G
maxmemory 2gb
# 淘汰策略
maxmemory-policy allkeys-lru
# LRU采样数,越大越准确越慢
maxmemory-samples 5
# 查看当前配置
CONFIG GET maxmemory
CONFIG GET maxmemory-policy
# 动态修改配置
CONFIG SET maxmemory-policy allkeys-lfu
常见误区
淘汰策略不用配置:默认 noeviction,内存满了写入直接报错,生产一定要配置
LRU 是严格的 LRU:Redis 的 LRU 是近似 LRU,采样算法,不是精确的
淘汰了就从磁盘删了:淘汰是删内存里的,持久化文件里的还在
LFU 一定比 LRU 好:各有场景,访问频率稳定 LFU 好,时间维度冷热明显 LRU 好
课后练习
配置最大内存为 1GB
设置淘汰策略为 allkeys-lru
简述 8 种淘汰策略的区别
思考:缓存场景为什么推荐 allkeys-lru?

