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 个。
注意:定期删除是概率性的。如果大量键在同一秒过期,单次抽查可能无法全部清理,导致内存瞬时压力。这也是缓存雪崩的诱因之一。
下图展示了过期键的完整生命周期与删除路径:
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 策略:即将过期的键被提前淘汰,可能导致大量键同时失效,加剧缓存雪崩风险。
下图对比了三种常见淘汰策略在内存压力下的行为差异:
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,以更准确保留热点搜索词缓存。