一、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