2. Redis 基础回顾:核心数据结构、常用命令、过期策略与内存淘汰机制

在深入缓存失效与容错设计之前,必须夯实 Redis 基础。本章将系统梳理 Redis 的五大核心数据结构及其适用场景、常用命令,并重点剖析过期策略与内存淘汰机制——这两者直接决定了缓存失效的行为模式与系统稳定性。

2.1 五大核心数据结构与常用命令

Redis 并非简单的键值存储,其每种数据结构都对应特定的业务抽象。下表总结了五种核心类型的特性、典型命令与时间复杂度:

数据结构 底层编码 典型命令(部分) 时间复杂度 适用场景
String int / embstr / raw SET GET MSET MGET INCR DECR SETEX O(1) 计数器、分布式锁、Session、缓存值
Hash ziplist / hashtable HSET HGET HMSET HGETALL HDEL HLEN O(1) 单字段 对象缓存(用户信息、商品详情)
List quicklist LPUSH RPUSH LPOP RPOP LRANGE LLEN O(1) 头尾操作 消息队列、时间线、最新列表
Set intset / hashtable SADD SREM SMEMBERS SISMEMBER SCARD SINTER O(1) 单元素 标签系统、去重、共同好友
Sorted Set ziplist / skiplist ZADD ZREM ZRANGE ZREVRANGE ZSCORE ZINCRBY O(log n) 排行榜、延迟队列、限流滑动窗口
工程提示:在搜索服务中,String 常用于缓存单个搜索结果摘要,Hash 用于存储文档字段级缓存,Sorted Set 则用于实现搜索热词排名与分页游标。

2.2 过期策略:被动与主动的双重保障

Redis 的过期删除并非实时扫描所有键,而是采用 惰性删除 + 定期删除 的组合策略,在性能与内存释放之间取得平衡。

  • 惰性删除(Lazy Deletion):当客户端访问一个键时,Redis 先检查其是否已过期。若过期则立即删除并返回 nil。这种策略对 CPU 友好,但若过期键长期不被访问,则会持续占用内存。
  • 定期删除(Active Expiration):Redis 每隔 100ms 随机抽取一批设置了过期时间的键,检查并删除其中已过期的键。通过 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 参数控制每次抽查数量,默认 20 个。
注意:定期删除是概率性的。如果大量键在同一秒过期,单次抽查可能无法全部清理,导致内存瞬时压力。这也是缓存雪崩的诱因之一。

下图展示了过期键的完整生命周期与删除路径:

Redis 过期键删除流程 键设置 TTL 客户端 GET 请求 惰性删除(过期则删) 定期删除(后台扫描) 内存释放 定期删除:每 100ms 随机抽查 20 个过期键

2.3 内存淘汰机制:当内存达到上限时

当 Redis 使用的内存达到 maxmemory 配置上限时,写入操作会触发内存淘汰策略。理解这些策略对于设计缓存失效后的回源行为至关重要。

Redis 8 种淘汰策略可分为三类:

类别 策略名称 淘汰逻辑 适用场景
不淘汰 noeviction 写入直接返回错误 纯缓存不可丢失的场景
(仅限读请求正常)
全体键淘汰 allkeys-lru 淘汰最近最少使用的键 通用缓存,追求命中率
allkeys-lfu 淘汰最不经常使用的键 访问频率差异明显的场景
allkeys-random 随机淘汰 均匀分布,无热点
带过期键淘汰 volatile-lru 在设置了 TTL 的键中淘汰 LRU 混合存储(持久+缓存)
volatile-lfu 在设置了 TTL 的键中淘汰 LFU 带过期时间的热点数据
volatile-ttl 淘汰剩余 TTL 最短的键 优先保留即将过期的数据
架构决策:在搜索服务中,建议使用 allkeys-lru 或 volatile-lru。前者适合纯缓存场景,后者适合缓存与持久数据共存的实例。避免使用 noeviction,否则缓存雪崩时回源写入会直接失败。

2.4 淘汰策略选择对缓存失效的影响

不同的淘汰策略直接影响缓存失效的分布与回源压力:

  • LRU 策略:热点数据保留,冷数据优先淘汰。缓存失效集中在低频访问键上,回源压力较小。
  • LFU 策略:访问频率低的键被淘汰,适合流量波动大的场景。但新晋热点可能因历史频率低而被误淘汰。
  • TTL 策略:即将过期的键被提前淘汰,可能导致大量键同时失效,加剧缓存雪崩风险。

下图对比了三种常见淘汰策略在内存压力下的行为差异:

三种淘汰策略行为对比 allkeys-lru 淘汰最近最少访问的键 热点保留,冷门淘汰 回源压力:低 allkeys-lfu 淘汰访问频率最低的键 新热点可能被误淘汰 回源压力:中 volatile-ttl 淘汰剩余 TTL 最短的键 批量失效风险高 回源压力:高 选择建议:搜索服务缓存优先使用 allkeys-lru,兼顾命中率与回源稳定性 避免 volatile-ttl 在大量键同时过期时引发缓存雪崩

2.5 关键配置参数速查

以下参数直接影响缓存失效行为,在生产环境中需谨慎调优:

# 最大内存限制(单位:bytes)
maxmemory 4gb

# 淘汰策略
maxmemory-policy allkeys-lru

# 定期删除频率(hz,默认10,表示每秒执行10次)
hz 10

# 惰性删除开关(默认开启)
lazyfree-lazy-expire yes

# 淘汰采样数(LRU/LFU/TTL 策略的近似精度)
maxmemory-samples 5
调优要点:maxmemory-samples 默认 5,增大该值可提高淘汰精度但消耗更多 CPU。在搜索服务中建议设为 10,以更准确保留热点搜索词缓存。