RedisNotes

第 01 章:认识 Redis

zjc 于 2026-01-01 发布

这是《Redis 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。

1.1 从一个真实场景开始

假设商品详情页每次打开都要执行几十条 SQL:商品基础信息、SKU、库存、价格、优惠券、推荐位、评价统计。数据库能扛住每秒几千次查询,但大促时页面请求可能是每秒几万次,数据库会瞬间被打满。

最直接的做法是加索引、拆库、读库扩容,但这些都改变不了核心事实:详情页的数据被反复读取,而每次读取的结果几乎相同

Redis 的价值在这里出现:

请求 -> 先查 Redis 命中 -> 直接返回
     -> 未命中 -> 查数据库 -> 写入 Redis -> 返回

热点商品进入内存,数据库只处理冷数据和首次加载,读性能从毫秒级进入亚毫秒级。这是 Redis 最经典的用法,但它远不只是缓存。

1.2 Redis 是什么

Redis(REmote DIctionary Server)是一个基于内存的键值数据库,同时提供持久化和多种数据结构能力。

三个关键词:

  1. 基于内存:数据主要存内存,读写延迟极低,单实例常见可达 10 万 QPS 以上;
  2. 键值模型:所有数据通过 key 定位,value 支持字符串、哈希、列表、集合、有序集合、位图、流等结构;
  3. 可持久化:通过 RDB/AOF 将内存数据落到磁盘,用于重启恢复和数据留存。

Redis 的定位不是替代 MySQL。它更像一个“高速数据结构服务”:适合热点、临时、实时、可重建或可容忍有限丢失的数据;不适合作为复杂关系查询和超大容量的事实源。

1.3 Redis 的历史与版本脉络

Redis 由 Salvatore Sanfilippo(antirez)在 2009 年为解决意大利实时日志统计系统性能问题而开发,2010 年后逐渐成为缓存与实时系统的标准组件。

版本 时间 关键特性
1.x 2009 基础数据结构与内存存储
2.x 2010-2013 复制、AOF、虚拟内存(后移除)
3.x 2015 Redis Cluster 分片
4.x 2017 Modules 生态、LRU 改进
5.x 2018 Stream 数据类型
6.x 2020 多线程 IO、ACL、RESP3、TLS
7.x 2022 Functions、Sharded Pub/Sub、AOF 改进
8.x 2025 集成 Search/JSON/TimeSeries 等能力,性能与可观测性增强

说明:Redis 8 将部分 Redis Stack 能力整合进主版本,但本书主线仍是开源通用的核心 Redis 能力;涉及增强模块时会明确说明。生产选型还应关注许可协议、团队运维能力和替代项目(如 Valkey)。

1.4 Redis 为什么快

面试常问,也真正决定你能不能调优。答案不是简单的“内存快”,而是一组设计选择:

  1. 内存存储:避免磁盘随机 IO,主路径只访问内存;
  2. 高效数据结构:SDS、哈希表、跳表、紧凑列表等针对不同 value 类型优化;
  3. 单线程命令执行:命令执行没有锁竞争和线程上下文切换,路径简单;
  4. IO 多路复用:一个线程用 epoll/kqueue 管理成千上万连接;
  5. RESP 协议轻量:文本协议易解析,RESP3 提供更多语义但依然高效;
  6. 避免昂贵操作:多数操作 O(1)/O(logN),危险命令通过异步或拆分处理;
  7. 6.0+ IO 多线程:读写 socket 与协议解析可并行,命令执行仍单线程。

速记:

内存 + 高效结构 + 单线程执行 + epoll + 轻协议 + IO 多线程

但单线程也意味着:一个慢命令会拖住整实例。KEYS *、超大集合的全量读取、误用 Lua 长循环,都是事故源。

1.5 Redis 能做什么

1. 缓存

保存热点对象、页面片段、接口聚合结果,降低数据库压力。

2. 会话存储

Session、登录 token、验证码、设备状态。设置 TTL,天然适合短生命周期数据。

3. 计数器

阅读数、点赞数、库存扣减、限流窗口。INCR/DECR 原子执行。

4. 排行榜

ZSet 按 score 排序,支持实时更新与范围查询。

5. 分布式锁

SET key value NX PX ttl 做互斥;成熟方案常用 Redisson 看门狗与可重入锁。

6. 消息与事件流

Pub/Sub 适合低延迟广播;Stream 支持消费组、ack 与 pending 记录。

7. 实时标签与画像

Set 做交并差,Bitmap 做签到与活跃用户统计,HyperLogLog 做海量 UV 估算。

1.6 Redis 不适合什么

  1. 大容量冷数据主存储:内存成本高,不适合 PB 级归档;
  2. 复杂关联查询:没有 join、group by、SQL 优化器;
  3. 强事务业务主库:事务能力有限,回滚不覆盖执行后的数据破坏;
  4. 高频大 key 读写:单线程会被慢命令阻塞;
  5. 对数据零丢失要求极高:异步复制与故障切换可能丢失最后一批写入,需业务或存储方案兜底。

一句话:Redis 负责“快”,数据库负责“真”。 不要把事实源从数据库里轻易拿走。

1.7 Redis、Memcached 与 KV 数据库对比

维度 Redis Memcached etcd DynamoDB 类
数据结构 丰富 仅 key/value 字符串 KV/lease KV/文档/索引
持久化 RDB/AOF/混合 Raft 日志 云托管
复制 主从/哨兵/Cluster 客户端分片 强一致 Raft 服务托管
事务 MULTI/Lua,有限 MVCC 事务 事务支持
一致性 可调,常见最终一致 缓存语义 强一致 可配置
典型用途 缓存/实时结构 纯缓存 元数据/配置 云上 KV

Memcached 更简单纯粹;etcd 更强调强一致元数据;Redis 的优势是“内存 + 数据结构 + 生态完整”的组合。

1.8 Redis 学习地图

入门                实战                原理                 运维               架构
01-06 章      ->    07-12 章      ->    13-19 章       ->    20-24 章      ->    25-29 章
命令/数据类型       客户端/锁/并发       内存/持久化/HA        监控/调优/迁移       缓存/多活/生态

初学者最常见的问题是“背命令”;中级工程师常见问题是“只会当缓存”;高级工程师必须理解:value 类型怎么选、内存怎么省、故障时怎么恢复、并发下是否正确。这本书会沿着这条路径推进。

1.9 环境准备

第 3 章前准备:

本章小结

思考题

  1. 你的系统中哪些数据适合放 Redis?哪些必须继续留在数据库?
  2. Redis 单实例 10 万 QPS,是否意味着可以直接横向扩到 1000 万 QPS?瓶颈还会出现在哪里?
  3. 如果 Redis 宕机 5 分钟,哪些业务可以降级,哪些必须强依赖?