Skip to content

第01章:Redis 是什么 —— 从零认识 Redis ​

本章目标 ​

学完本章后,你将能够:

  1. 用自己的话解释 Redis 是什么
  2. 说出 Redis 为什么快(三个核心原因)
  3. 列举 Redis 至少 6 个应用场景
  4. 区分 Redis、MySQL、Memcached 的定位

前置知识 ​

  • 了解 MySQL 基本概念(什么是数据库)
  • 无需 Redis 基础,本章从零讲起

1.1 什么是 Redis ​

Redis(Remote Dictionary Server)是一个开源的内存数据库。注意三个关键词:

关键词含义
内存数据存在内存里,断电可能丢(但有持久化机制)
数据库不是简单的缓存,支持多种数据结构和持久化
远程通过网络访问,不是嵌入在程序里的

一句话:Redis 是一个把数据存在内存里的高性能 KV 数据库。

MySQL(磁盘数据库)                Redis(内存数据库)
┌─────────────────┐              ┌─────────────────┐
│  硬盘 (SSD/HDD)  │              │   内存 (RAM)     │
│  读写: ~0.1ms    │              │  读写: ~0.001ms   │
│  容量: TB级      │              │  容量: GB级       │
│  数据不丢        │              │  断电可能丢       │
└─────────────────┘              └─────────────────┘

1.2 Redis 为什么快 ​

Redis 能达到 10万+ QPS(每秒处理 10 万个请求),原因有三:

原因一:纯内存操作 ​

数据在内存里,没有磁盘 I/O。内存读写速度是磁盘的 1000 倍。

原因二:单线程模型 ​

Redis 用单线程处理命令(Redis 6.0+ 网络 I/O 多线程,但命令执行还是单线程)。好处:

  • 没有线程切换开销
  • 没有锁竞争
  • 没有并发问题

"单线程还这么快?" —— 因为瓶颈不在 CPU,而在网络 I/O。单线程够用了。

原因三:IO 多路复用 ​

单线程可以同时监听多个网络连接,哪个有数据来了就处理哪个。就像餐厅服务员一个人同时服务多桌客人。

传统模型:一个请求 → 一个线程 → 读完数据 → 处理 → 返回
(1000 个请求 = 1000 个线程)

IO 多路复用:一个线程 → 监听 1000 个连接 → 谁有数据就处理谁
(1000 个请求 = 1 个线程)

1.3 Redis 能做什么 ​

场景说明用到什么
缓存热点数据放 Redis,减少 MySQL 压力String, Hash
排行榜实时更新分数,查询排名Sorted Set
计数器点赞数、阅读量、库存String (INCR)
分布式锁多台服务器抢一个锁String (SETNX)
消息队列简单可靠的消息传递List, Stream
Session 存储多台 Web 服务器共享 SessionHash
好友关系共同好友、可能认识的人Set
附近的人地理位置查询Geo
限流控制 API 调用频率String, ZSet
去重统计UV 统计、去重计数HyperLogLog, Set

1.4 Redis vs MySQL ​

维度MySQLRedis
存储位置磁盘内存
读写速度毫秒级微秒级
数据模型表(行+列)KV + 多种数据结构
持久化天然持久可选(RDB/AOF)
查询语言SQL简单命令
容量TB 级GB 级(受内存限制)
典型用途主存储缓存/辅助存储

📌 Redis 不能替代 MySQL。Redis 速度快但容量有限,适合存热数据。MySQL 存全量数据。


1.5 Redis vs Memcached ​

两者都是内存 KV 存储,但:

维度RedisMemcached
数据类型5+ 种只有 String
持久化✅❌
集群✅ Cluster❌
事务✅❌
线程模型单线程多线程
适用场景复杂业务简单缓存

1.6 Redis 核心特性一览 ​

特性说明
多种数据结构String, Hash, List, Set, ZSet, Bitmap, Geo, Stream...
持久化RDB 快照 + AOF 日志
主从复制数据备份 + 读写分离
哨兵 Sentinel自动故障转移
集群 Cluster数据分片,水平扩展
Lua 脚本原子性执行多条命令
事务MULTI/EXEC(不支持回滚)
发布订阅Pub/Sub 消息模式
过期策略TTL + 惰性删除 + 定期删除
ACLRedis 6.0+ 用户权限管理

常见错误 ​

错误1:认为 Redis 只是缓存 ​

很多人只把 Redis 当缓存用,其实它的数据结构(ZSet/Set/Geo/Stream)能做很多事情——排行榜、附近的人、消息队列都不需要"后端数据库"。

错误2:以为 Redis 数据不会丢 ​

Redis 默认持久化是关闭的(RDB 有间隔,AOF 默认不开)。如果不配置持久化,重启就丢数据。

错误3:以为 Redis 可以替代 MySQL ​

Redis 是内存数据库,数据量受限于内存大小。100GB 的 MySQL 数据库全放到 Redis 需要 100GB+ 内存,成本高出几个数量级。


本章小结 ​

  • Redis = 内存 KV 数据库 + 多种数据结构
  • 快的原因:纯内存 + 单线程 + IO 多路复用
  • 能做的事远超"缓存":排行榜、分布式锁、消息队列、附近的人...
  • Redis 是 MySQL 的"加速器",不是"替代品"

练习题 ​

  1. 用自己的话解释 Redis 的三个"快"的原因。
  2. 列举 Redis 至少 6 个应用场景,并说明用到了什么数据结构(可以先猜)。
  3. 为什么 Redis 不能替代 MySQL?从容量和查询能力两个角度回答。
  4. Redis 和 Memcached 的三个核心区别是什么?
  5. (思考题)如果 Redis 是单线程,那为什么 Redis 6.0 要引入多线程?多线程用在了哪里?

把零散知识,整理成可以反复走的路。