Redis 大 key 和热 key 排查

Redis 大 key 和热 key 排查

Redis 的五种数据结构各有特色,用对了才能发挥它的优势。很多人只用到了 String 和 Hash,却不知道 List、Set、ZSet 在特定场景下更合适。本文从应用场景出发,讲什么时候用什么类型。

先明确 Redis 在系统里的角色

Redis 常见用途不是“替代数据库”,而是缓存热点数据、保存会话、做简单计数、排行榜、分布式锁等。设计时要先问:这份数据丢了能不能恢复?是否允许短暂不一致?

一个缓存查询的基本写法

String key = "user:" + userId;
User user = redisTemplate.opsForValue().get(key);
if (user != null) {
return user;
}
user = userMapper.selectById(userId);
if (user != null) {
redisTemplate.opsForValue().set(key, user, Duration.ofMinutes(30));
}
return user;

这个流程看起来简单,但要注意缓存穿透、缓存击穿和缓存雪崩。

三个常见问题

  • 穿透:查询不存在的数据,可以缓存空值或用布隆过滤器。
  • 击穿:热点 key 过期瞬间大量请求打到数据库,可以用互斥锁或逻辑过期。
  • 雪崩:大量 key 同时过期,可以给过期时间增加随机值。

验证方式

本地可以先用 redis-cli 查看 key:

redis-cli
GET user:1001
TTL user:1001

确认缓存写入、过期时间和删除策略都符合预期。

核心要点

  1. String:简单的键值对,适合缓存、计数器

  2. Hash:存储对象属性,适合用户信息、配置

  3. List:有序列表,适合消息队列、最新列表

  4. Set:无序去重,适合共同好友、抽奖

  5. ZSet:有序集合,适合排行榜、积分系统

总结

选择合适的数据结构是使用 Redis 的关键。在实际项目中,根据业务需求选择合适的类型,可以提升性能和开发效率。


   转载规则


《Redis 大 key 和热 key 排查》 小乐 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录