Skip to content

Redis

这篇总览页从工程实践的角度梳理 Redis,重点放在 数据结构缓存治理过期与淘汰持久化高可用分布式协调工程实践 这些真正会影响系统设计和稳定性的主题上。

如果你准备继续深入,可以看这些独立专题:

这页把阅读入口和重点主题串起来;带 🌟 的小节表示这些内容在后端开发里更常见,也更值得优先掌握。


1. Redis 适合解决什么问题

Redis 是一个以内存为核心的键值数据库。它最重要的价值,不在于“命令很多”,而在于能用很低的延迟承接高频读写、短期状态存储和轻量级分布式协调。

它比较适合这些场景:

  1. 热点数据缓存
  2. 会话、验证码、令牌等短期状态存储
  3. 计数器、限流、排行榜
  4. 简单消息分发和异步削峰
  5. 轻量级分布式锁和协调

它不太适合这些场景:

  1. 复杂关系查询和多表关联
  2. 强事务、强关系约束很重的主业务存储
  3. 超大规模低成本冷数据存储
  4. 大量分析型查询

工程里更常见的定位是:高性能辅助存储,而不是关系型数据库的直接替代品。


2. 🌟 为什么 Redis 快

Redis 快,不只是因为“数据在内存里”,而是下面几层因素一起作用:

2.1 数据主要在内存里

Redis 的大多数读写都直接发生在内存里,而不是每次都去访问磁盘。

这意味着:

  1. 不需要频繁等待磁盘 I/O
  2. 单次访问延迟通常更低
  3. 高频小请求更容易被快速处理

这是第一层原因,但不是全部原因,因为同样都在内存里,系统也未必一定快。

2.2 数据结构本身就是为高频操作设计的

Redis 的优势不只是“把数据放进内存”,还在于数据结构本身就贴近高频业务场景。

例如:

  1. String 适合单值缓存和计数器
  2. Hash 适合对象字段存取
  3. Set 适合去重和成员判断
  4. ZSet 适合排行榜和按分值排序

这意味着很多业务动作不需要把一大块数据取回应用层再自己处理,而是可以直接用 Redis 的结构能力完成。

数据结构和访问模式贴合时,命令路径会更短,应用侧逻辑也会更轻。

2.3 命令执行路径短,很多操作可以直接命中目标数据

Redis 的很多高频命令都很“短”。

例如一次简单读取,通常就是:

  1. 解析命令
  2. 定位 key
  3. 读取内存数据
  4. 返回结果

它不像关系型数据库那样,经常还要经历:

  1. SQL 解析
  2. 优化器选择执行计划
  3. 多表关联
  4. 磁盘页读取和回表

这不是说 Redis “比数据库高级”,而是两者解决的问题不同。Redis 更擅长简单结构、高频访问和低延迟返回。

所以当业务问题本身就适合用键值访问表达时,Redis 的处理链路会天然更短。

2.4 单线程命令执行模型减少了很多锁竞争成本

这里最容易被记偏的一句话是“Redis 是单线程,所以快”。更稳妥的理解是:

  1. Redis 的核心命令执行路径长期以单线程为主
  2. 这样做减少了共享状态并发修改时的复杂锁竞争
  3. 代价是单条命令一旦很重,后续请求就要排队

真正该记住的不是“单线程天然快”,而是:命令足够短、数据主要在内存里时,简单执行模型反而能省掉很多线程切换和锁协调成本。

这也是为什么 Redis 特别强调:

  1. 避免慢命令
  2. 避免大 Key
  3. 避免把很重的逻辑塞进单次执行路径

2.5 I/O 多路复用让它能用较低成本处理很多连接

Redis 还会配合 I/O 多路复用 处理网络连接。

可以直接把它理解成:一个线程可以同时监听很多连接,谁有数据就先处理谁。

这带来的直接价值是:

  1. 不需要像“一连接一线程”那样维持大量线程
  2. 网络层资源开销更低
  3. 在大量短请求场景下更容易维持高吞吐

所以 Redis 的快,不只是“内存访问快”,还包括连接管理和事件分发模型也比较轻。

2.6 一条请求大致是怎么走完的

可以用这张图建立整体感:

mermaid
flowchart LR
    A[客户端发送命令] --> B[事件循环监听到可读连接]
    B --> C[解析 Redis 命令]
    C --> D[根据 key 定位数据结构]
    D --> E[在内存中执行操作]
    E --> F[返回结果给客户端]

这条链路之所以快,核心就在于:

  1. 大多数步骤都比较短
  2. 不需要频繁磁盘读写
  3. 很多高频操作可以直接命中内存结构

2.7 但 Redis 的快也有边界

Redis 快,不等于任何操作都一直快。真正会把它拖慢的,通常是这些问题:

  1. BigKey 导致单次读写或删除很重
  2. 慢命令阻塞后续请求
  3. 热点 Key 流量过于集中
  4. 网络传输、序列化和批量返回数据过大
  5. 把不适合 Redis 的复杂业务硬塞进来

可以直接记成:Redis 快,是因为内存访问、数据结构、执行模型和事件处理一起把高频请求路径压短了;但只要命令变重、数据变大、热点过热,它一样会变慢。


3. 🌟 Redis 的数据结构不是只有 5 种

很多资料会先讲 5 种基础类型:

  1. String
  2. Hash
  3. List
  4. Set
  5. ZSet

这当然是最常见的一组数据结构,但如果想把 Redis 用清楚,还得补上几类很常见的能力:

  1. Bitmap
  2. HyperLogLog
  3. GEO
  4. Stream
结构更适合什么场景
String缓存值、计数器、分布式锁基础实现
Hash对象字段存储
List简单队列、按顺序存储元素
Set去重、集合关系
ZSet排行榜、按分数排序
Bitmap签到、布尔位统计
HyperLogLog近似去重统计
GEO附近的人、附近门店
Stream消息流、消费组

如果想系统看每种结构的适用场景、常见命令和选型边界,可以继续看独立专题:


4. Redis 最常见的工程角色其实是缓存

Redis 在真实业务里最典型的角色还是缓存,但真正难的部分从来不是“把数据库结果塞进去”,而是:

  1. 缓存和数据库的一致性怎么处理
  2. 缓存穿透、击穿、雪崩怎么治理
  3. 热点数据怎么预热和保护
  4. 高并发回源怎么控制

最常见的缓存模式通常是 Cache Aside

  1. 读请求先查缓存
  2. 缓存没命中再查数据库
  3. 再把结果回填到缓存
  4. 写请求先更新数据库,再删除缓存或重建缓存

而缓存真正的治理重点通常包括:

  1. 过期时间设计
  2. 热点 Key 管理
  3. 一致性窗口控制
  4. 回源保护和降级策略

如果想系统看缓存模式、常见问题和一致性治理,可以继续看独立专题:


5. 🌟 过期、淘汰、持久化是三件不同的事

Redis 里非常容易混淆的三个概念是:

  1. 过期时间
  2. 内存淘汰
  3. 持久化

它们分别在解决不同问题:

主题解决的问题
过期时间Key 应该什么时候自然失效
内存淘汰内存不够时应该优先丢掉谁
持久化重启或故障后怎样恢复数据

这三块通常要一起理解,原因很简单:

  1. 过期策略会影响缓存行为
  2. 淘汰策略会影响热点数据保留
  3. 持久化会影响故障恢复和数据安全

很多系统问题并不是 Redis 命令写错了,而是这三层策略没有一起设计清楚。

如果想把这一块按更清晰的知识边界单独看,可以继续看独立专题:


6. 🌟 高可用和集群扩展该怎么分开理解

Redis 线上环境里最常见的几种形态是:

  1. 主从复制
  2. Sentinel
  3. Cluster

可以把它们拆开理解:

  1. 主从复制解决副本同步问题
  2. Sentinel 更偏高可用治理和故障转移
  3. Cluster 更偏数据分片和横向扩展

这意味着:

  1. 只做主从复制,不等于高可用治理已经完整
  2. 只知道 Sentinel,也不等于已经解决容量扩展问题
  3. 进入 Cluster 后,系统会新增分片、路由和热点分布问题

如果想系统看持久化、主从复制、Sentinel 和 Cluster 的关系,可以继续看独立专题:


7. Redis 不只是缓存,还常承担轻量级分布式协调

Redis 在很多系统里还会承担这些能力:

  1. 分布式锁
  2. 限流
  3. 幂等控制
  4. 简单消息分发
  5. 延迟队列或轻量任务队列

但边界要分清。

例如分布式锁,不能只停留在:

  1. setnx
  2. “设置成功就算加锁”

更稳妥的实现还要考虑:

  1. 原子加锁
  2. 过期时间
  3. 唯一标识
  4. 安全释放
  5. 业务执行时间超过锁时长怎么办

同样,Redis 也可以做消息分发,但如果业务对可靠性、顺序性、堆积能力要求很高,通常还是要回到更专业的消息队列系统。

如果想系统看事务、Lua、Pipeline、分布式锁、BigKey 和 HotKey 治理,可以继续看独立专题:


8. Redis 常见适用场景

比较适合的场景通常包括:

  1. 商品详情、用户信息、配置等热点缓存
  2. 登录态、验证码、会话状态
  3. 阅读数、点赞数、接口频控
  4. 排行榜、优先级集合
  5. 附近门店、位置计算
  6. 简单消息流和消费组处理

要谨慎评估的场景通常包括:

  1. 大量复杂查询和多条件关联
  2. 对持久性要求极高且不能接受内存成本
  3. 跨很多实体的强事务写入
  4. 把 Redis 当成“所有数据都能放进去的主库”

选型时最关键的问题不是“Redis 快不快”,而是:这类数据到底是不是高频访问、短状态、简单结构,并且值得用内存来换性能。


9. 🌟 怎么把 Redis 讲清楚

如果要把 Redis 的核心价值压缩成一段说明,可以从这 4 个角度去讲:

  1. 它解决的是高频读写和低延迟访问问题
  2. 它为什么适合缓存和短期状态存储
  3. 它在数据结构、过期淘汰、持久化、高可用上分别要注意什么
  4. 它不适合哪些复杂关系和强事务场景

可以压缩成下面这段理解:Redis 更适合热点数据缓存、短期状态存储和轻量级分布式协调。它的优势在于低延迟和丰富的数据结构,但系统是否稳定,最终取决于缓存治理、过期淘汰策略、持久化、高可用设计以及对 HotKey、BigKey 等工程问题的控制。


10. 一份更实用的 Redis 检查清单

如果把前面的内容压成一份实践清单,可以优先检查这些问题:

  1. 数据是否真的值得用内存承接
  2. 数据结构是否贴合访问模式
  3. 缓存更新和一致性策略是否明确
  4. 穿透、击穿、雪崩是否有治理方案
  5. 过期时间和淘汰策略是否贴合业务
  6. 持久化方式是否匹配数据安全要求
  7. 主从、Sentinel、Cluster 的使用边界是否清楚
  8. 分布式锁、限流、消息流是否在合理边界内使用
  9. 是否已经识别并治理 HotKey 和 BigKey

Redis 真正难的部分,从来不是记住多少命令,而是把数据结构、缓存模式、故障恢复和集群治理一起设计清楚。

基于 VitePress 构建的个人技术笔记。