Redis 原理大纲

Redis 这块你要建立的不是“会几个命令”,而是这条原理链:

内存结构 -> 单线程与 IO 模型 -> 数据结构 -> 持久化 -> 过期/淘汰 -> 在业务系统里的定位

一、总纲

Redis 原理层最核心的 6 条主线:

  1. 为什么快
  2. 数据结构
  3. 过期与淘汰
  4. 持久化
  5. 缓存与一致性
  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 更像性能层、幂等层和协调层,而不是业务主库。