
系统架构师学习平台点击这里进入⚡ Redis 核心指南Redis (Remote Dictionary Server) — 开源、基于 Key-Value 的内存 NoSQL 数据库常作为 MySQL 前的高速缓存层。 10W QPS 持久化 RDB/AOF Redisson 分布式锁 面试高频 一句话Redis 内存 单线程 I/O多路复用读写比磁盘快10~100倍降低DB压力。 一、数据类型 经典场景类型特点典型场景String字符串/数值原子增减缓存、计数器、分布式锁(setnx)Hash键值对嵌套 (field-value)购物车、用户对象存储List双向链表有序可重复消息队列、最新评论列表Set无序不可重复集合运算抽奖(spop)、共同好友(sinter)ZSet按分数排序唯一排行榜、延时队列✨ 特殊类型️ Geo附近的人 / 门店距离 HyperLogLog日活UV统计 (0.81%误差) Bitmap签到 / 在线状态 / 布隆过滤器基础⚠️ 二、缓存三兄弟 · 穿透击穿雪崩 缓存穿透问题查询不存在的数据请求绕过缓存直达DB恶意攻击可能导致DB崩溃。✅解决方案① 缓存空对象 (短期TTL)②布隆过滤器(位图多个hash高效拦截不存在Key允许小概率误判)。 缓存击穿 (热点key过期)问题高并发下热点key失效大量请求同时打到数据库。✅解决方案① 热点key永不过期逻辑过期②互斥锁 (分布式锁)仅允许一个线程重建缓存。 缓存雪崩问题大量key同时过期 或 Redis宕机瞬时流量压垮数据库。✅解决方案① TTL加随机值② Redis集群高可用③ 多级缓存④ 限流/熔断。 记忆口诀穿透无中生有布隆挡击穿过期锁与非期扛雪崩大量过期加随机三兄弟保底限流强。 三、缓存与MySQL一致性双写数据变化时保证 Redis 与 DB 最终一致性的常见方案方案实现方式特点先更DB 删缓存更新数据库后删除Redis缓存读取时重建简单可能短暂不一致延迟双删先删缓存 → 更新DB → 延时再次删除避免旧数据回写延迟难控制MQ异步通知DB更新后发消息消费者更新缓存解耦、有重试最终一致Canal监听Binlog伪装MySQL从库读取binlog同步到Redis无业务侵入实时性高选型建议强一致性业务直接查库允许短暂不一致 → MQ/Canal 最终一致。 四、持久化机制 (数据不丢失)特性RDB (快照)AOF (追加日志)原理定期生成全量二进制快照 dump.rdb记录每条写命令到 appendonly.aof恢复速度快速直接加载二进制慢逐条重放命令数据安全可能丢失最后一次快照后的数据每秒刷盘最多丢1秒数据性能影响fork子进程短暂阻塞fsync策略影响IO生产最佳实践混合持久化(RDB全量备份 AOF增量补充)配置:appendonly yesappendfsync everysec 合理RDB save规则。⏳ 五、过期删除 内存淘汰Redis采用惰性删除 定期删除▪ 惰性删除访问key时检查过期则删除 → 节省CPU。▪ 定期删除每隔100ms随机抽查一批过期key → 平衡CPU与内存。 内存淘汰策略 (达到maxmemory时)策略行为推荐场景volatile-lru从设置过期时间的key中淘汰最近最少使用大部分生产场景有永久数据allkeys-lru从全体key淘汰最近最少使用纯缓存场景数据可重建volatile-lfu淘汰访问频率最低的设置过期热点数据倾斜noeviction不淘汰内存满时写入报错默认金融/支付强数据安全 LRU 最久未访问LFU 最少频率访问带衰减机制。 六、分布式锁Redisson实现场景集群定时任务、抢券、扣库存 — 保证同一时刻只有一个线程执行。原生Redis锁:SET lock value NX EX 10 DEL存在原子性隐患。Redisson 改进✅ Lua脚本保证 setnx过期时间原子性✅可重入锁(Hash结构存储线程ID重入次数)✅WatchDog看门狗自动续期 (每10秒续期一次避免业务未完成锁释放)✅ 自旋重试机制提升性能⚠️ 主从切换可能导致锁丢失强一致性建议用 ZooKeeper 锁 看门狗核心锁持有后自动续期业务完成需手动unlock高并发下性能优越。 七、高可用 集群进化 主从复制 (读写分离)一主多从主写从读。全量同步首次连接 bgsave RDB增量同步通过偏移量从复制积压缓冲区获取缺失命令。️ 哨兵模式 Sentinel监控 自动故障转移 通知客户端。解决主从手动切换。⚠️ 脑裂问题配置最少从节点个数和同步延迟阈值缓解。 分片集群 (Cluster)解决海量数据高并发写16384个哈希槽每个key通过CRC16(key)%16384映射到槽槽分布在多个主节点水平扩展。每个主节点可带从节点自动故障转移。不支持跨槽事务可用{hash_tag}强制同槽。 生产建议节点数 ≥ 3副本数 ≥ 1避免脑裂。结合哨兵实现高可用海量数据选用Cluster。⚡ 八、为什么Redis如此快✅ 纯内存操作读写极快✅ 单线程执行命令(6.0后IO多线程但命令仍单线程)避免上下文切换和竞态✅I/O多路复用 (epoll)单线程同时监听多个socket事件驱动不空转✅ 高效数据结构设计 渐进式rehash Redis变慢了怎么排查慢查询日志slowlog get查看复杂命令避免bigkey--bigkeys扫描大key阻塞主线程大量key同时过期 → TTL添加随机值AOF重写与磁盘竞争配置no-appendfsync-on-rewrite yes检查swapINFO memory若swap过大则增加内存/集群扩容 九、Redis vs Memcache 高频考点对比维度MemcacheRedis数据类型仅字符串丰富 (String/Hash/List/Set/ZSet等)持久化不支持重启丢失RDBAOF混合持久化高可用无原生支持主从/哨兵/集群原子性部分指令单指令原子 Lua保证多指令 面试高频附加题• 数据库有1000w数据Redis仅缓存20w热点 → 选用allkeys-lru或volatile-lru策略。• Redis内存满了怎么办取决于淘汰策略默认 noeviction 直接报错。• 布隆过滤器实现原理位数组 多个hash函数通过0/1快速判断“肯定不存在”存在微小误判率。• 缓存三兄弟解决方案汇总穿透布隆/空值、击穿互斥锁/逻辑过期、雪崩随机TTL/集群/限流。 十、速记汇总·一图流 穿透布隆过滤器空值缓存 击穿互斥锁/逻辑永不过期 雪崩随机TTL集群限流 持久化RDB快照 AOF everysec 淘汰策略allkeys-lru / volatile-lru 集群哨兵(高可用) → Cluster(水平分片) 总结Redis基于内存、单线程I/O多路复用成就高性能生产环境务必配置合理淘汰策略持久化使用Redisson优雅解决分布式锁。适用场景缓存、分布式锁、排行榜、计数器、消息队列、Session共享、实时分析。