用途:在 NestJS 项目中实现多级缓存、缓存失效模式与缓存击穿(stampede)保护,属于 P1 高优先级规范。
主要能力:
- 分层缓存:高流量读接口使用多级缓存。L1 为本地内存(Node.js 堆,无网络、极快),配置或静态数据可用 lru-cache;L2 为分布式 Redis,跨 Pod 共享。推荐 Stale-While-Revalidate 模式,避免缓存未命中时的延迟尖峰。
- NestJS 实现:使用 cache-manager 搭配 cache-manager-redis-yet(V4 稳定性优于 cache-manager-redis-store)。简单 GET 响应可用 @UseInterceptors(CacheInterceptor)。注意默认 key 为 URL,需保证查询参数顺序一致或使用自定义 key 生成器。
- 击穿保护:为 TTL 添加随机抖动,防止多 key 同时过期;使用锁机制,由一个进程重算,其余等待或返回旧数据。
- Redis 数据结构:Hash(HSET)存对象并支持部分更新;Set(SADD)做唯一集合与 O(1) 成员判断;Sorted Set(ZADD)用于优先队列、排行榜、限流窗口。
- 失效模式:用 Set 对缓存 key 分组打标签,避免生产环境使用 O(N) 的 KEYS。创建时 SADD post:1:tags cache:post:1;失效时从 Set 取标签再 DEL 分组 key。也可监听领域事件(如 UserUpdated)异步触发失效。
限制与反模式:生产环境禁用 KEYS,改用基于 SET 的标签分组;分组缓存不要用固定 TTL,需加抖动(约 ±10s);多 Pod 场景不要用 MemoryStorage,须用 Redis 存储,因为内存缓存不跨 Pod 共享。
资料未提供具体安装命令、完整代码示例与版本细节。