← ClaudeAtlas

caching-strategylisted

【缓存策略】设计和实现缓存方案,包含缓存选型、缓存模式、失效策略、缓存穿透/击穿/雪崩防护。 触发时机: - 用户要求"设计缓存方案"、"优化缓存" - 系统性能瓶颈在数据库查询 - 需要实现分布式缓存 支持 Redis/Memcached/本地缓存方案设计。
afine907/skills · ★ 0 · AI & Automation · score 75
Install: claude install-skill afine907/skills
# Caching Strategy — 缓存策略技能 设计系统性缓存方案,解决高并发读取性能问题。 ## Goal 设计和实现缓存方案,包含缓存选型、缓存模式、失效策略、缓存穿透/击穿/雪崩防护 ## Trigger - 用户要求"设计缓存方案"、"优化缓存" - 系统性能瓶颈在数据库查询 - 需要实现分布式缓存 ## 缓存选型 | 类型 | 适用场景 | 优势 | 劣势 | |------|----------|------|------| | 本地缓存 | 单实例、高频读 | 零网络开销 | 不支持分布式 | | Redis | 分布式、丰富数据结构 | 高性能、持久化 | 需要额外服务 | | Memcached | 简单 KV、多线程 | 简单高效 | 功能有限 | | CDN | 静态资源 | 全球加速 | 仅限静态内容 | ## 缓存模式 ### 1. Cache-Aside(旁路缓存) 最常用的模式,应用层控制缓存。 ``` 读流程: 1. 先查缓存 2. 缓存命中 → 返回 3. 缓存未命中 → 查数据库 4. 写入缓存 5. 返回数据 写流程: 1. 更新数据库 2. 删除缓存(而非更新) ``` ```python async def get_user(user_id: str) -> User: # 1. 查缓存 cache_key = f"user:{user_id}" cached = await redis.get(cache_key) if cached: return User.parse_raw(cached) # 2. 查数据库 user = await db.get_user(user_id) if user is None: # 缓存空值,防止缓存穿透 await redis.setex(cache_key, 60, "null") return None # 3. 写入缓存 await redis.setex(cache_key, 3600, user.json()) return user async def update_user(user_id: str, data: UserUpdate): # 1. 更新数据库 await db.update_user(user_id, data) # 2. 删除缓存 await redis.delete(f"user:{user_id}") ``` ### 2. Read-Through / Write-Through 缓存层代理数据库操作。 ``` 读流程: 1. 查缓存 2. 缓存未命中 → 缓存层自动从 DB 加载 3. 返回数据 写流程: 1. 写入缓存 2. 缓存层自动同步到 DB ``` ### 3. Write-Behind(异步写入) 写入只到缓存,异步批量同步到 DB。 ``` 写流程: 1. 写入缓存(立即返回) 2. 异步批量写入 DB 适用场景: - 写入量大 - 允许短暂数据不一致 - 如:计数器、