用途:把昂贵计算或高频读取的数据放到更靠近消费端的位置,重点处理失效(保持正确)与击穿(应对大规模未命中)两类失败模式,而非简单的 get/set 封装。
主要能力: 策略选择:cache-aside(默认,简单、缓存宕机不影响写入、失效可控)、read-through、write-through(写入同步更新缓存,适合无法容忍写后读到旧值)、write-behind(异步批量落库,仅适合可丢失、可重算的数据如指标、计数器、动态流)。 击穿防护:按 key 加锁(单飞,跨节点需分布式锁 SET key val NX PX 30000)、概率提前过期(XFetch 公式)、stale-while-revalidate;TTL 必须加 ±10% 抖动,避免同步过期。 负缓存:缓存未命中与错误,用短 TTL 加显式哨兵(如 NULL)区分未命中;高基数穿透可用 Bloom filter。 TTL 与淘汰:按易变性分层设置 TTL,滑动 TTL 需设绝对上限;淘汰策略可选 allkeys-lru、allkeys-lfu、volatile-ttl,默认 noeviction 会在内存满时报写错误。 Redis 模式与陷阱:对象用 hash、排行用 sorted set、队列用 list;复合操作用 Lua 保证原子;批量用 pipeline,原子批量用 MULTI/EXEC;生产禁用 KEYS,改用 SCAN;注意热 key 与大 key 问题,大 key 用 UNLINK。 失效:标签/分组失效、版本键(user:42:v7)、事件驱动失效;先写 DB 再失效缓存,且是删除而非更新。 键设计:确定性、无冲突、带命名空间与版本,包含 locale、租户、鉴权范围等所有影响值的因素。 分层缓存:浏览器 → CDN → 应用 L1(进程内 LRU)→ Redis L2 → DB。 HTTP/CDN:用 Cache-Control、ETag、immutable、stale-while-revalidate 等头控制正确性,按 URL 指纹做缓存失效。
使用方式:资料给出 cache-aside 的 get_or_load 示例、按 key 加锁示例、XFetch 判断式、进程内 LRU 类实现,以及 Redis 命令与 HTTP 头写法,可直接参考。
适用场景:数据库查询缓存、ML 预测/模型/嵌入缓存、HTTP 与 CDN 缓存等。
限制:write-behind 崩溃会丢写,不可作为不可丢失数据的记录源;进程内锁只对单进程有效;模式匹配失效是兜底而非设计;缓存应视为可选,缓存全挂时源站仍需正确工作;需监控命中率、延迟、淘汰率与内存。