Redis
内存里的万能瑞士军刀,缓存和分布式锁都靠它
Redis 把数据放在内存里,单机十万级 QPS 很轻松。它不只是缓存:String、Hash、List、Set、ZSet、Bitmap、HyperLogLog 这些结构能做排行榜、计数器、分布式锁、限流、消息队列。用它的关键不是会不会命令,而是知不知道缓存会怎么坏。
它解决什么问题
数据库每秒只能扛几千次查询,首页热门商品却要被访问几十万次。每次都查库,数据库直接被打挂。
真实场景:典型场景:商品详情先查 Redis,命中直接返回;没命中查 MySQL 再写回 Redis,并设置随机过期时间,避免同一时刻集体失效。
核心概念
每个概念一句话 + 一个类比。点击卡片看更详细的解释。
缓存穿透
查一个根本不存在的 key,请求每次都打到数据库
类比:有人拿假身份证天天来查档案,柜员每次都翻一遍库房
看概念详情缓存击穿
某个热点 key 过期的瞬间,大量请求同时回源
类比:超市最火的商品刚好卖完,所有人一起冲进仓库
看概念详情缓存雪崩
大批 key 同时过期或 Redis 整体挂掉,流量全压到数据库
类比:整栋楼同时停电,所有人一起走楼梯
看概念详情持久化 RDB / AOF
RDB 存快照,AOF 记命令,重启后靠它们恢复数据
类比:RDB 是定期拍照,AOF 是写日记
看概念详情分布式锁
用 SET NX EX 抢一个 key,抢到的人才能执行临界区
类比:厕所门上的“有人”牌子
看概念详情数据结构
String/Hash/List/Set/ZSet,选对结构比写对命令更重要
类比:工具箱,拧螺丝别用锤子
看概念详情数据流转动画
跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。
一次缓存读取的完整路径
← 左右滑动查看完整流程图 →
业务代码先 GET product:1,绝大多数请求在这一步就返回了。
提示:命中就返回,未命中才回源;写回时记得加随机过期时间。 悬停图中的节点可以看概念解释。
优劣势
短句说清适合什么、不适合什么,选型时先看这一栏。
- 内存读写,延迟亚毫秒,QPS 十万级
- 数据结构丰富,计数器/排行榜/队列都能做
- 支持过期、Lua 脚本、事务、发布订阅
- 部署简单,单机就能跑,运维成本低
- 内存贵,容量受限于机器内存
- 单线程处理命令,大 key 会阻塞整个实例
- 持久化不是强一致,宕机可能丢秒级数据
- 主从异步复制,故障切换可能丢数据
常见使用场景
每个场景都配一句「为什么用它」。
热点数据缓存
商品详情、用户会话、配置项放 Redis,挡住 90% 以上的读请求。
为什么用它:把随机 IO 变成内存访问,数据库只承担回源流量。
分布式锁与限流
SET key value NX EX 抢锁,或用 INCR + 过期做计数器限流。
为什么用它:多实例部署时,本地锁不管用,需要一个公共的裁决者。
排行榜与计数
ZSet 存分数做实时排行榜,Hash 存对象字段做增量更新。
为什么用它:ZSet 的跳表结构让范围查询和排名都是 O(log N)。
常见问题
上手第一个月最容易卡住的地方。
Q1缓存和数据库一致性怎么保证?
常用 Cache Aside:读时先缓存后库;写时先更新库、再删除缓存(不是更新缓存)。仍可能短暂不一致,用延迟双删或订阅 binlog(Canal)异步删缓存兜底。强一致场景别用缓存。
Q2分布式锁怎么实现?
SET lock:order:1 uuid NX EX 30 抢锁,value 存唯一标识,释放时用 Lua 脚本比对 value 再 DEL,防止误删别人的锁。生产环境更推荐 Redisson 的看门狗续期。
Q3缓存穿透、击穿、雪崩怎么区分?
穿透是查不存在的数据(用布隆过滤器/空值缓存);击穿是单个热点 key 失效(用互斥锁或逻辑过期);雪崩是大量 key 同时失效或实例挂了(用随机过期 + 多级缓存 + 熔断降级)。
Q4RDB 和 AOF 怎么选?
RDB 文件小、恢复快,但可能丢几分钟数据;AOF 更安全(everysec 最多丢 1 秒),文件更大恢复更慢。生产一般两个都开:RDB 做冷备,AOF 做增量。
Q5Redis 是单线程的,为什么还这么快?
纯内存操作、IO 多路复用、单线程避免锁竞争和上下文切换。6.0 之后网络 IO 是多线程的,命令执行仍是单线程,所以一条慢命令照样会卡住所有人。