Redis 原理大纲
Redis 这块你要建立的不是“会几个命令”,而是这条原理链:
内存结构 -> 单线程与 IO 模型 -> 数据结构 -> 持久化 -> 过期/淘汰 -> 在业务系统里的定位
一、总纲
Redis 原理层最核心的 6 条主线:
- 为什么快
- 数据结构
- 过期与淘汰
- 持久化
- 缓存与一致性
- 幂等、锁和高并发控制
二、Redis 为什么快
1. 不要只答“单线程”
更完整的原因是:
- 内存访问快
- 数据结构高效
- 避免复杂线程切换
- IO 多路复用
2. 为什么单线程不一定慢
因为 Redis 的主要瓶颈不是 CPU 计算,而是网络 IO 和内存访问。 在这种场景下,单线程模型反而简化了并发控制。
3. 但 Redis 也不是绝对快
如果:
- bigkey
- 热点 key
- 慢命令
- 大量阻塞操作
一样会出问题。
三、Redis 数据结构原理
1. string
最常用,适合:
- 缓存
- 计数
- 简单状态
2. hash
适合结构化对象字段存储。
3. list
适合队列和简单顺序消息。
4. set
适合去重和集合运算。
5. zset
最重要,适合:
- 排行榜
- 按时间排序
- 延迟任务
四、过期策略和淘汰策略
1. 过期策略
key 到时间了怎么处理。
常见是:
- 惰性删除
- 定期删除
2. 淘汰策略
内存不够时淘汰哪些 key。
3. 为什么这两个不能混为一谈
一个是“到期该删”,一个是“内存不够必须淘汰”。
五、持久化原理
1. RDB
快照方式,适合定期备份。
2. AOF
追加命令日志,恢复更细。
3. 两者取舍
- RDB:恢复快,文件紧凑,但可能丢最近数据
- AOF:数据更完整,但恢复慢一些
4. 工程上的理解
很多业务里 Redis 更偏缓存和幂等层,不一定要求像 MySQL 一样承载最终真实状态。
六、缓存原理与业务边界
1. 为什么要加缓存
因为很多读请求没必要每次都打主库。
2. 缓存的本质问题
不是“怎么存”,而是:
- 什么时候失效
- 怎么和数据库一致
- 热点怎么处理
3. 典型问题
- 缓存穿透
- 缓存击穿
- 缓存雪崩
4. 工程上的理解
缓存不是万能提速手段。 如果业务状态本身特别敏感,比如支付结果、订阅状态,缓存只能辅助,不能替代主状态来源。
七、Redis 做幂等与锁
1. 幂等为什么适合 Redis
因为 Redis 适合记录短期处理标记或窗口期状态。
2. 分布式锁为什么常用 Redis
因为获取和释放速度快,适合做协调控制。
3. 但不要滥用
很多问题其实:
- 用唯一键就够了
- 用状态机就够了
- 用条件更新就够了
锁是最后手段,不是第一反应。
八、zset 为什么特别重要
因为它把“值”和“排序权重”组合在一起。
典型用途
- 排行榜
- 延迟任务
- 超时关闭
- 按时间窗口扫描
这很适合你讲订单超时关闭或任务调度场景。
九、为什么 Redis 在你的项目里有价值
海外业务平台
- 热点缓存
- 状态控制
- 可能的幂等窗口
核心交易链路
- 防重复提交
- 幂等
- 部分热点数据
推广 ROI 线
- 去重
- 短期状态
- 事件窗口处理
十、Redis 的边界
Redis 不适合作为:
- 长期真实业务主状态存储
- 大规模分析库
- 复杂关系型主库
它更适合:
- 性能层
- 协调层
- 短期状态层
十一、你至少要讲顺的一条原理链
请求进入 -> 先看缓存/幂等/热点控制 -> Redis 内存结构快速处理 -> 必要时回源 MySQL -> 再更新或失效缓存
这条链讲顺,Redis 不会只剩“为什么快”。
十二、最适合你的结尾表达
我对 Redis 的理解,不是停留在几个命令,而是知道它为什么快、适合承接什么类型的数据和逻辑,也知道它的边界在哪里。在我的项目里,Redis 更像性能层、幂等层和协调层,而不是业务主库。