一、先搞懂什么是热 Key / 大 Key1. 热 KeyHot Key瞬间大量请求打到同一个 Redis 节点例如爆款商品、热点活动、热门主播、热搜后果单节点 CPU 100%、超时、雪崩、整个集群不可用2. 大 KeyBig KeyValue 特别大或 Hash/Set/ZSet/List 内部元素极多典型String 10KBHash/Set/ZSet 5000 个元素一次性加载 1MB后果网络阻塞、主线程阻塞、OOM、慢查询、集群倾斜二、热 Key 完整解决方案1. 提前发现热 Key方式1Redis 自带监控redis-cli--hotkeys方式2业务埋点监控最准网关层/Service 层统计访问频次1s 内访问 100 次标记为热 Key方式3客户端监控Redisson/Jedis 拦截AOP 拦截 get/set 操作计数 告警2. 热 Key 解决方案方案1本地缓存Caffeine—— 最有效、成本最低// Caffeine 本地缓存性能 Guava EhcacheprivatestaticfinalLoadingCacheString,ObjectHOT_KEY_CACHECaffeine.newBuilder().maximumSize(1000).expireAfterWrite(100,TimeUnit.MILLISECONDS)// 极短过期.build(key-redisTemplate.opsForValue().get(key));// 使用publicObjectgetHotKey(Stringkey){returnHOT_KEY_CACHE.get(key);}优点完全挡住 Redis 流量10w QPS 无压力注意过期时间要短避免不一致方案2备份多副本打散流量热 Key 复制成 N 个副本hot_key:0hot_key:1hot_key:2…hot_key:7读时随机取一个写时全部更新。解决 Redis 单节点热点。方案3Redis 集群分片优化热 Key 会固定打在一个 slot 一个节点可以使用hashtag 强制打散不推荐只应急方案4多级缓存架构千万级必备用户 → Nginx 本地缓存 → 应用本地缓存(Caffeine) → Redis → DB99% 请求在前面三层就消化掉。三、大 Key 完整解决方案1. 如何发现大 Keyredis-cli--bigkeys或使用Redis Insight阿里云 Redis 控制台大 Key 诊断自定义扫描任务典型大 Key用户购物车1000商品大列表、大活动配置超长日志、长文本未拆分的集合2. 大 Key 优化实战① 拆拆拆核心解法大 Hash 拆成小 Hashuser:cart:1001→ 拆成user:cart:1001:0user:cart:1001:1…按商品 ID 取模拆分。② 控制单次获取数量// 错误一次性全拉redisTemplate.opsForHash().entries(cart:1001);// 正确分页拉取redisTemplate.opsForHash().scan(cart:1001,ScanOptions.limit(20));③ 压缩存储GZIP大文本、大JSON开启压缩// 序列化时压缩byte[]compressedGzipUtils.compress(jsonBytes);redisTemplate.opsForValue().setBytes(key,compressed);可减少70%~90% 体积。④ 避免使用长生命周期大 Key大 Key 永不过期 定时炸弹四、千万级流量 Redis 整体性能调优核心1. 内存配置maxmemory-policy volatile-lru # 淘汰过期 maxmemory 16GB # 不要吃满物理内存 hz 10 # 提高定时任务频率2. 关闭危险配置stop-writes-on-bgsave-error no # 持久化失败不阻塞 rdbcompression yes rdbchecksum no3. 网络优化tcp-backlog 16384 tcp-keepalive 300 net-core.somaxconn 163844. 客户端优化Jedis/Lettuce 线程池配置spring:redis:lettuce:pool:max-active:200max-idle:50min-idle:16max-wait:100mstimeout:50ms千万QPS必须用连接池不能每次新建连接5. 批量操作优化性能提升10~50倍错误循环 getfor(Stringid:ids){redisTemplate.opsForValue().get(id);}正确pipeline / mgetredisTemplate.executePipelined((RedisCallbackObject)connection-{for(Stringkey:keys){connection.get(key.getBytes());}returnnull;});6. 避免阻塞 Redis 主线程禁止使用keys *hgetallsmemberszrange大量元素flushdb/flushall一律用scan替代。7. 持久化调优高并发必做appendonly yes appendfsync everysec # 生产标准 auto-aof-rewrite-percentage 100 aof-load-truncated yes高并发下appendfsync always直接卡死。8. 集群倾斜优化大 Key 导致节点内存不均热 Key 导致节点 CPU 不均优化拆分大 Key热 Key 多副本手动迁移 slot五、高并发场景终极架构千万级稳跑Nginx 缓存 ↓ 本地缓存 Caffeine热点兜底 ↓ Redis 集群主从哨兵 ↓ DB 多级降级 熔断限流六、生产常见故障与急救1. 热Key打爆Redis立即上本地缓存临时增加副本熔断非核心接口2. BigKey导致OOM批量删除大Keyunlink 非 del异步清理拆分3. Redis 频繁 RDB/AOF 卡顿关闭自动保存低峰手动触发使用 appendfsync everysec4. 连接池耗尽调大连接数检查慢查询检查是否未释放连接