用途:该技能指导在已有 Redis 的产品中正确使用 Redis 做读缓存、锁、限流和会话存储。资料强调 Redis 是带 TTL 的易失存储,资金、库存、权限的真相来源仍是 Postgres,队列与重试交给 background-jobs(同一 Redis,但 key 契约不同)。只有产品已具备 Redis 或需求明确要求时才引入,不应为了“变快”而无命中率与清晰 key 就缓存。
主要能力与规则:所有 key 必须带前缀(app:env:…)和 TTL,或明确的持久化策略(少见);缓存值是派生数据,需在写入真相源时失效或用短 TTL;不得无短 TTL 地写入 PII/密钥,也不得进入日志。GET 未命中则计算再 SET 带 TTL;防击穿用 SET NX、短锁或应用内 singleflight;key 中要含租户/用户,避免全局 cache:users。
适用与不适用:适合 HTML 片段、幂等 GET、会话的读缓存,唯一任务与短幂等锁,认证与昂贵 API 的限流,以及栈已用 Redis 时的会话存储。不适合存余额、“已支付”、业务唯一性,不能用锁替代 Postgres 唯一约束,限流不能作为授权唯一防线,也不应无过期地镜像整个用户。Bull/Sidekiq 的 broker key 由库管理,不要与 cache: 混用。
Key 与 TTL:格式为 {app}:{env}:{tenant}:{resource}:{id}:{variant},序列化要稳定(规范 JSON),结构变化时在 key 加版本(:v2)。TTL 与新鲜度对齐(秒到小时),“永久”仅在写入失效并有 runbook 时使用。淘汰时接受 miss;可缓存页面不应因 Redis 宕机返回 500,应降级到源。
击穿与失效:热 key 用 SET lock:… NX EX 5 或进程内合并;写入时在同一工作单元内(DB 提交后)删除/更新已知 key,禁止删 *;可对“不存在”做短 TTL 空值缓存以挡 404。限流用滑动/固定窗口或令牌桶,返回 429 与 Retry-After,认证 fail closed、页面缓存可 fail open;锁值随机,仅值匹配时 DEL(Lua/compare),锁必须带 TTL。
运维与反模式:compose 中镜像固定版本,仅会话/队列用途才开 AOF/RDB;启用 ACL/密码,不把 Redis 暴露公网;观测命中率、淘汰与内存,生产禁用 KEYS *(用 SCAN)。反模式包括把 Redis 当订单/支付数据库、无 TTL 缓存、未命中时大量相同 SELECT、部署时 FLUSHALL、把用户 A 的认证响应缓存到无 user id 的 key、缓存与任务负载共用 key。完成标准:key 有前缀与 TTL、含租户,写入失效或 TTL 诚实,处理 miss/击穿,Redis 宕机不破坏资金,队列与缓存命名空间分离,无永久 PII。