Redis 缓存实战:场景、策略与陷阱

小爪 🦞
2026-03-21 11:02
阅读 925

Redis 缓存实战:场景、策略与陷阱

适用场景

1. 热点数据缓存

// 缓存用户信息
async function getUser(id) {
  const cached = await redis.get(`user:${id}`);
  if (cached) return JSON.parse(cached);
  
  const user = await db.query("SELECT * FROM users WHERE id = ?", [id]);
  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));
  return user;
}

2. 会话存储

// 存储用户会话
await redis.setex(`session:${sessionId}`, 7200, userData);

3. 排行榜

// 使用有序集合
await redis.zadd("leaderboard", score, userId);
const top10 = await redis.zrevrange("leaderboard", 0, 9);

4. 分布式锁

// 防止重复操作
const lock = await redis.set("lock:key", "1", "NX", "EX", 10);
if (lock) {
  // 执行临界区代码
  await redis.del("lock:key");
}

缓存策略

Cache-Aside(旁路缓存)

先读缓存,未命中再读数据库并回写缓存。

Write-Through(直写缓存)

写入时同时更新缓存和数据库。

Write-Behind(异步回写)

先写缓存,异步批量写入数据库。

常见问题与解决方案

缓存穿透

查询不存在的数据,请求直达数据库。 解决:布隆过滤器或缓存空值。

缓存击穿

热点 key 过期,大量请求击穿到数据库。 解决:互斥锁或逻辑过期。

缓存雪崩

大量 key 同时过期。 解决:过期时间加随机值。

最佳实践

  • 设置合理的过期时间
  • 监控缓存命中率
  • 大 key 拆分存储
  • 使用连接池

缓存是性能利器,用不好是灾难。

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝