Redis 缓存淘汰策略
如何估算缓存容量大小
「二八定律」:百分之八十的访问会落到百分之二十的热点数据上
内存容量建议设置在总数据量的 15%~30%
Redis 设置最大缓存容量:
Redis 缓存淘汰策略
8 中淘汰策略:
- 1 种不进行淘汰策略: noeviction
- 7 种进行淘汰策略,按照是否设置过期时间,进行数据集淘汰进行分类
- 有设置过期时间: volatile-random, volatile-ttl, volatile-lru, volatile-lfu 在设置了过期时间的数据集中进行淘汰
- 未设置过期时间: allkeys-random, allkeys-lru, allkeys-lfu 进行全局数据范围淘汰
noeviction 不进行数据淘汰
当 Redis 缓存使用超过 maxmemory,不进行数据淘汰,同时 Redis 不在提供写服务。一般不使用这个配置策略。
volatile-random, volatile-ttl, volatile-lru, volatile-lfu 在设置了过期时间的键值对进行数据淘汰
当缓存写满或数据过期时,进行数据淘汰
- volatile-ttl 按照过期时间的先后顺序进行数据删除
- volatile-random 在设置过期时间的数据集中随机删除
- volatile-lru 依据 LRU 算法筛选过期时间数据进行删除
- volatile-lfu 依据 LFU 算法筛选过期时间数据进行删除
allkeys-random, allkeys-lru, allkeys-lfu 在所有键值对中进行数据淘汰
- allkeys-random 从所有键值对中随机淘汰
- allkeys-lru 依据 LRU 算法筛选所有数据进行淘汰
- allkeys-lfu 依据 LFU 算法筛选所有数据进行淘汰
LRU 算法
LRU : least recently used 最近最少使用。实现大致逻辑是,将所有数据以链表形式组织,最近访问的数据移动至表头,当数据写满时,删除队尾数据(淘汰),存在 2 个问题:
1: 需要额外的链表管理所有数据 2: 当大量数据访问时,会进行频繁的链表移动
Redis LRU 算法实现
Redis 对经典 LRU 算法进行简化,Redis 记录没有数据最近一次的访问时间戳,当进行数据淘汰时,随机选出 N 个元素作为淘汰候选集,然后比较 N 个数据的 lru 字段,把最小的数据从缓存中淘汰删除。
候选集挑选规则: 进入候选集的数据的 lru 字段必须小于当前候选集中的最小 lru 值。
配置项 maxmemory-samples 用于配置候选集 N 的数据个数:
config set maxmemory-samples 100
Redis 缓存淘汰策略最佳实践
- 数据访问频率差异大(冷热数据区分明显)优先使用 allkeys-lru 策略
- 数据访问频率差异不大时(无明显冷热数据区分)推荐使用 allkeys-random 策略
- 业务有置顶需求(置顶新闻、视频)使用 volatile-lru 策略,并对指定数据不设置过期时间