软考高级系统架构师之Redis篇
2026/6/8 6:37:48 网站建设 项目流程

系统架构师学习平台(点击这里进入)

⚡ Redis 核心指南

Redis (Remote Dictionary Server) — 开源、基于 Key-Value 的内存 NoSQL 数据库,常作为 MySQL 前的高速缓存层

💡 一句话:Redis = 内存 + 单线程 + I/O多路复用,读写比磁盘快10~100倍,降低DB压力。

📚 一、数据类型 & 经典场景

类型特点典型场景
String字符串/数值,原子增减缓存、计数器、分布式锁(setnx)
Hash键值对嵌套 (field-value)购物车、用户对象存储
List双向链表,有序可重复消息队列、最新评论列表
Set无序不可重复,集合运算抽奖(spop)、共同好友(sinter)
ZSet按分数排序,唯一排行榜、延时队列
✨ 特殊类型

⚠️ 二、缓存三兄弟 · 穿透|击穿|雪崩

🔍 缓存穿透

问题:查询不存在的数据,请求绕过缓存直达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 yes+appendfsync 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 改进:

🐕 看门狗核心:锁持有后自动续期,业务完成需手动unlock,高并发下性能优越。

🌐 七、高可用 & 集群进化

📡 主从复制 (读写分离)

一主多从,主写从读。全量同步:首次连接 bgsave + RDB;增量同步:通过偏移量从复制积压缓冲区获取缺失命令。

👁️ 哨兵模式 Sentinel

监控 + 自动故障转移 + 通知客户端。解决主从手动切换。
⚠️ 脑裂问题:配置最少从节点个数和同步延迟阈值缓解。

🧩 分片集群 (Cluster)

解决海量数据+高并发写:
16384个哈希槽,每个key通过CRC16(key)%16384映射到槽,槽分布在多个主节点,水平扩展。
每个主节点可带从节点,自动故障转移。不支持跨槽事务,可用{hash_tag}强制同槽。

💡 生产建议:节点数 ≥ 3,副本数 ≥ 1,避免脑裂。结合哨兵实现高可用,海量数据选用Cluster。

⚡ 八、为什么Redis如此快?

🔧 Redis变慢了怎么排查?

📌 九、Redis vs Memcache & 高频考点

对比维度MemcacheRedis
数据类型仅字符串丰富 (String/Hash/List/Set/ZSet等)
持久化不支持,重启丢失RDB+AOF混合持久化
高可用无原生支持主从/哨兵/集群
原子性部分指令单指令原子 + Lua保证多指令

💬 面试高频附加题:
• 数据库有1000w数据,Redis仅缓存20w热点 → 选用allkeys-lruvolatile-lru策略。
• Redis内存满了怎么办?取决于淘汰策略,默认 noeviction 直接报错。
• 布隆过滤器实现原理:位数组 + 多个hash函数,通过0/1快速判断“肯定不存在”,存在微小误判率。
• 缓存三兄弟解决方案汇总:穿透(布隆/空值)、击穿(互斥锁/逻辑过期)、雪崩(随机TTL/集群/限流)。

📖 十、速记汇总·一图流

🔥 总结:Redis基于内存、单线程+I/O多路复用成就高性能;生产环境务必配置合理淘汰策略+持久化,使用Redisson优雅解决分布式锁。

适用场景:缓存、分布式锁、排行榜、计数器、消息队列、Session共享、实时分析。


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询