高并发下Redis的缓存穿透、雪崩、击穿解决方案实战

179 阅读4分钟

一、Redis基础篇(高频必考)

1.1 Redis核心数据结构与应用场景

大厂(如阿里、腾讯)常要求候选人能结合实际业务场景说明数据结构选择依据。Redis的五大基础数据结构包括:

String:最简单的KV存储,适用于计数器(如秒杀库存)、单值缓存(如用户token)。例如字节跳动用String实现直播间的在线人数统计。 Hash:字段级操作特性适合存储对象(如电商商品详情页的规格参数),美团用Hash实现外卖骑手的位置信息更新。 List:消息队列(如微博的评论列表)、阻塞队列(如滴滴的司机抢单任务池)。 Set:去重场景(如微信共同好友推荐)、随机抽奖(如拼多多的砍价活动参与者)。 SortedSet:排行榜(如B站视频热榜)、延迟队列(如京东订单超时关闭)。

扩展考点:HyperLogLog(UV统计)、Geo(美团外卖配送范围计算)、Pub/Sub(实时消息推送)需结合业务举例说明。

1.2 内存淘汰策略与热点数据

高频问题:MySQL有2000w数据,Redis只存20w,如何保证Redis中都是热点数据?

答案拆解:

设置maxmemory限制内存总量,避免物理内存耗尽 采用LRU/LFU算法:volatile-lru(淘汰最近最少使用的过期键)或allkeys-lfu(全量淘汰最不常用键) 业务层双删策略:更新数据库后先删Redis数据,异步线程二次删除(防止并发查询导致脏数据)

实战技巧:美团采用allkeys-lfu+本地缓存兜底,防止突发流量击穿Redis

二、高并发场景篇(BATJ重点考核)

2.1 缓存穿透/雪崩/击穿解决方案

阿里P7级高频题:如何设计一个抗住百万QPS的缓存系统?

缓存穿透(请求不存在的数据): 布隆过滤器:拼多多用RedisBloom模块预处理请求,拦截90%无效查询 空值缓存:设置短TTL(如30秒),避免频繁穿透

缓存雪崩(大量Key同时失效): 随机过期时间:基础TTL+随机偏移量(如300秒±10%) 多级缓存架构:腾讯方案=本地缓存(Caffeine)+Redis集群+数据库降级

缓存击穿(热点Key突然失效): 互斥锁:Redisson的tryLock实现串行化查询 逻辑过期:Value中存储过期时间,异步更新

2.2 分布式锁实现与陷阱

字节跳动真题:Redis分布式锁在集群故障时如何保证可靠性?

Redisson红锁(RedLock)原理: 向N/2+1个节点申请锁(N为奇数) 自动续期机制(watchdog线程)防止业务未完成锁过期

常见陷阱: 锁误删(需用UUID标识客户端) 主从切换导致锁丢失(需用Redis Cluster模式) 网络延迟导致锁重叠(需设置合理的超时时间)

代码示例:

java 复制 // 腾讯云最佳实践 RLock lock = redisson.getLock("orderLock"); try { if (lock.tryLock(10, 60, TimeUnit.SECONDS)) { // 业务逻辑 } } finally { lock.unlock(); }

三、集群架构篇(架构师级考点)

3.1 Redis集群方案对比

蚂蚁金服P8级问题:如何设计一个跨地域多活的高可用Redis架构?

主从复制+哨兵: 适用中小规模(如日订单百万级) 缺点:扩容需手动操作,跨机房同步延迟高

Redis Cluster: 自动分片(16384个槽) 美团优选采用三机房部署,每个分片3主3从 Gossip协议维护拓扑状态

Proxy方案: 腾讯云Tendis:基于Raft协议强一致性 Codis:适合历史遗留系统迁移

3.2 持久化与数据恢复

京东618备战案例:

RDB:整点备份(如每6小时),用于快速恢复

AOF:appendfsync everysec平衡性能与安全

混合持久化(Redis 4.0+):重启时先加载RDB再重放AOF

灾难恢复方案:

阿里云采用OSS存储每日RDB快照 同城双活机房异步复制AOF文件 定期验证备份文件可恢复性

四、性能优化篇

4.1 大Key与热Key处理

拼多多压测问题:发现某个商品的QPS是普通商品的100倍,如何优化?

热Key拆分: 分桶存储:product:1001:part1 ~ product:1001:part10

本地缓存:Guava Cache设置1秒过期

大Key治理: Hash字段分片(如用户画像按tag拆分)

List/Set元素分批获取(LRANGE分页查询)

4.2 网络与线程模型

滴滴出行真题:单线程的Redis如何实现10万+QPS?

IO多路复用:
    epoll机制处理10万级连接
    字节跳动优化:调整tcp-backlog参数应对突发流量

Pipeline批处理:
    美团外卖订单批量查询减少RTT
    单次Pipeline建议控制在100个命令以内5

连接池优化:
    最大连接数=预估QPS/(1000/平均RT)
    异常连接自动剔除(如Jedis的testOnBorrow)2