Redis 缓存淘汰策略

Redis 缓存淘汰策略

如何估算缓存容量大小

「二八定律」:百分之八十的访问会落到百分之二十的热点数据上

内存容量建议设置在总数据量的 15%~30%

Redis 设置最大缓存容量:

config set maxmemory 4gb

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 策略,并对指定数据不设置过期时间

发表评论

电子邮件地址不会被公开。 必填项已用*标注