Redis 全面介绍

📅 2026/7/22 4:55:53 👁️ 阅读次数 📝 编程学习
Redis 全面介绍

目录

  1. Redis 是什么
  2. Redis 的特性
  3. Redis 的应用场景
  4. Redis 的构成
  5. Redis 客户端与连接命令
  6. 如何通过官方文档学习 Redis
  7. 总结

一、Redis 是什么

Redis(Remote Dictionary Server,远程字典服务)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库缓存消息中间件以及流处理引擎等多种角色。

1.1 核心定位

Redis 的本质是一个键值(Key-Value)型 NoSQL 数据库,但与传统 KV 存储(如 Memcached)不同,Redis 支持多种复杂的数据结构,并且将数据主要保存在内存中以实现极高性能,同时支持持久化以保证数据安全。

1.2 一句话概括

Redis 是一个用 C 语言编写的、支持网络通信、基于内存、可持久化、日志型的高性能键值数据库。

1.3 官方网站与资源

  • 官方主页:Redis - Real-time data for agents & apps
  • 官方文档:Docs
  • GitHub 仓库:https://github.com/redis/redis
  • 在线命令试用:https://try.redis.io

二、Redis 的特性

2.1 性能卓越

  • 读写性能极高:官方基准测试表明,单机 Redis 在普通 X86 机器上可达到10 万+ QPS的读性能,以及8 万+ QPS的写性能。
  • 延迟极低:典型操作延迟在微秒(μs)级别,通常 < 1ms。

2.2 丰富的数据结构

Redis 并非只支持简单的字符串,它内置了多种高级数据结构:

数据结构命令示例典型用途
String(字符串)SET、GET、INCR缓存、计数器、分布式锁
Hash(哈希)HSET、HGET、HGETALL对象存储、用户画像
List(列表)LPUSH、RPUSH、LPOP、RPOP消息队列、最新列表
Set(集合)SADD、SMEMBERS、SINTER标签、共同好友、去重
Sorted Set(有序集合)ZADD、ZRANGE、ZSCORE排行榜、滑动窗口限流
Stream(流,5.0+)XADD、XREAD、XGROUP消息流、事件溯源
Bitmap(位图)SETBIT、GETBIT、BITCOUNT用户签到、布隆过滤器
HyperLogLogPFADD、PFCOUNTUV 统计
Geo(地理空间)GEOADD、GEORADIUS附近的人、地图应用

等等

2.3 内存存储与持久化

  • 内存为主:核心数据保存在内存中以保证高速读写。
  • 可持久化:提供 RDB 快照和 AOF 日志两种机制,数据可以从内存落盘到磁盘,重启后可恢复。
  • 数据可淘汰:支持多种内存淘汰策略(LRU、LFU、Random、TTL 等)。

    这也是为什么Redis存储一般都是当缓存来存,使用也非常常见的重要原因之一,毕竟MySQL等大多数据库都是存储在硬盘的,我们拉取数据还要从硬盘写到我们的内存,由程序读写,非常慢。

2.4 高可用与分布式

  • 主从复制(Replication):支持一主多从,数据可以从主节点实时同步到从节点,实现读写分离与数据冗余。
  • 哨兵模式(Sentinel):自动监控主从节点状态,实现故障自动转移(Failover)。
  • Cluster 集群模式(Redis Cluster):官方提供的分布式方案,通过哈希槽(Hash Slot)将数据分片到多个节点,水平扩展能力极强。

2.5 功能丰富

  • 事务(MULTI/EXEC):支持简单的事务能力(不保证严格的 ACID)。
  • 发布订阅(Pub/Sub):内置消息广播能力。
  • Lua 脚本:通过 EVAL 执行 Lua 脚本,保证命令执行的原子性。
  • 模块化(Redis Modules):从 4.0 起支持动态加载第三方模块(如 RedSearch、RedisJSON、RedisGraph、RedisTimeSeries 等)。

2.6 多语言客户端

官方与社区为几乎所有主流编程语言提供了客户端:

  • Python:redis-py、aioredis
  • Java:Jedis、Lettuce、Redisson
  • Go:go-redis、redigo
  • Node.js:ioredis、node-redis
  • C/C++:hiredis
  • C#/.NET:StackExchange.Redis
  • PHP:predis、phpredis

2.7 简单稳定

  • 源码精简(早期版本约 3 万行 C 代码),无外部依赖(仅依赖 libc)。
  • 单线程核心命令处理模型(6.0 后部分命令多线程 IO),避免了复杂的锁竞争。

三、Redis 的应用场景

3.1 缓存(最常用)

将热点数据缓存在 Redis 中,减轻后端数据库(如 MySQL)的压力。

# 设置缓存(带过期时间 60 秒) SET user:1001 '{"id":1001,"name":"Tom"}' EX 60 # 读取缓存 GET user:1001

典型架构:

客户端 → Redis(缓存层) → MySQL(持久层)

3.2 分布式会话

在分布式 Web 应用中,使用 Redis 统一存储 Session 信息,实现多节点共享。

3.3 排行榜 / 计数

利用 Sorted Set 实现实时排行榜:

ZADD game:rank 1500 "playerA" ZADD game:rank 2300 "playerB" ZREVRANGE game:rank 0 9 WITHSCORES # 取前 10 名

利用 String 的 INCR 实现计数器:

INCR article:1001:read_count # 文章阅读量 +1

3.4 分布式锁

利用 SETNX(即 SET key value NX EX seconds)实现分布式锁:

SET lock:order:123 "uuid-xxx" NX EX 10

3.5 消息队列

  • 轻量级场景:使用 List 的 LPUSH + BRPOP 实现生产者-消费者模型。
  • 高可靠场景:使用 Redis 5.0+ 的 Stream 类型,支持消费组(Consumer Group)、ACK 机制、消息回溯等。
XADD mystream '*' field1 value1 field2 value2 XREAD COUNT 10 BLOCK 0 STREAMS mystream 0

3.6 限流

  • 简单计数器限流:INCR + EXPIRE
  • 滑动窗口限流:利用 Sorted Set 存储请求时间戳
  • 令牌桶/漏桶:通过 Lua 脚本原子实现

3.7 社交场景

  • 共同好友:SINTER
  • 关注/粉丝模型:Set + Sorted Set
  • 附近的人:Geo

3.8 实时分析

  • 用户在线状态:Bitmap
  • UV 统计:HyperLogLog
  • 实时排行:Sorted Set

3.9 其他场景

  • AI/大模型:向量检索(Redis 8.0+ 引入 Vector Set)

四、Redis 的构成(客户端与服务端)

Redis 系统从架构上可以分为客户端(Client)服务端(Server)两大部分,二者基于RESP(REdis Serialization Protocol)协议通过 TCP 通信。

┌──────────────┐ RESP 协议(TCP) ┌──────────────────┐ │ Redis 客户端 │ ───────────────────────────▶ │ Redis 服务端 │ │ (SDK/CLI) │ ◀─────────────────────────── │ (核心引擎) │ └──────────────┘ └──────────────────┘

4.1 客户端(Client)

客户端本质上是遵循 RESP 协议、与 Redis 服务端通信的应用程序或工具。它不存储业务数据,主要职责是:

4.1.1 客户端的核心功能
  1. 连接管理:与服务端建立 TCP 连接、维护连接池。
  2. 协议封装:将用户的操作(如 SET key value)按 RESP 协议编码后发送给服务端。
  3. 响应解析:将服务端返回的结果按 RESP 协议解析为编程语言的对象。
  4. 命令拼装与重试:为开发者提供高层 API(如 set("foo", "bar", ex=60))。
  5. 集群路由:在 Cluster 模式下计算 key 的哈希槽(CRC16),将命令路由到正确的节点。
  6. 故障转移感知:通过订阅服务端发布的主从切换事件,自动更新路由表。
4.1.2 常见 Redis 客户端分类

按使用场景可分为三类:

类别例子说明
官方命令行客户端redis-cli随 Redis 服务端一同发布
官方基准测试客户端redis-benchmark性能压测工具
第三方语言客户端(SDK)jedis、lettuce、redisson、redis-py、go-redis、ioredis、StackExchange.Redis 等应用代码中调用 Redis

Redis 客户端与连接命令

4.1.3 进入 Redis 客户端的命令
(1)启动 redis-cli(最常用)
# 连接本机默认端口 6379 redis-cli # 连接远程主机 redis-cli -h 127.0.0.1 -p 6379 (由此可以推测-h选项:host主机的意思,-p选项:端口的意思) # 通过密码认证 redis-cli -h 127.0.0.1 -p 6379 -a yourpassword # 通过用户名+密码(ACL,6.0+) redis-cli --user default -h 127.0.0.1 -p 6379 -a yourpassword # 使用 TLS 加密 redis-cli -h remote-host -p 6379 --tls # 指定数据库(默认 0-15) redis-cli -n 1 # 执行单条命令后退出 redis-cli SET hello world redis-cli GET hello # 以原始格式输出(无格式美化) redis-cli --no-raw GET hello # 进入交互模式后常用命令 127.0.0.1:6379> PING # 测试连通性,返回 PONG 127.0.0.1:6379> AUTH pwd # 认证 127.0.0.1:6379> SELECT 1 # 切换到 1 号库 127.0.0.1:6379> KEYS * # 查看所有键(生产慎用) 127.0.0.1:6379> SCAN 0 # 游标迭代键 127.0.0.1:6379> INFO # 查看服务端信息 127.0.0.1:6379> CLIENT LIST # 查看所有客户端连接 127.0.0.1:6379> MONITOR # 实时监控所有命令(调试用) 127.0.0.1:6379> SHUTDOWN NOSAVE# 关闭服务 127.0.0.1:6379> EXIT # 退出客户端
(2)Docker 方式进入客户端
# 在已运行的 redis 容器内打开 cli docker exec -it redis-container redis-cli # 直接用临时容器连接远程 redis docker run -it --rm redis:7.2 redis-cli -h host.docker.internal -p 6379
(3)GUI 客户端(图形界面工具)

适合开发与运维可视化:

  • RedisInsight(官方出品,跨平台,免费)
  • Another Redis Desktop Manager(开源,跨平台)
  • Medis(macOS,开源)
  • Redis Desktop Manager / RESP.app(跨平台)

4.2 服务端(Server)

服务端是 Redis 的核心,是一个常驻进程,负责接收客户端请求、处理命令、保存数据、进行持久化与高可用相关操作。

4.2.1 服务端的核心组件
┌─────────────────────────────────────────────────────────────┐ │ Redis Server 进程 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │ │ │ 网络 I/O │→│ 命令解析 │→│ 命令执行 │→│ 结果返回 │ │ │ └──────────┘ └──────────┘ └──────────┘ └─────────────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 事件驱动模型(AE 事件循环) │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────────┐ │ │ │ 字典 │ │ 持久化 │ │ 复制 │ │ 集群 / 哨兵 │ │ │ │(内存) │ │RDB/AOF │ │ 主从 │ │ Cluster │ │ │ └─────────┘ └─────────┘ └─────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘
4.2.2 服务端的核心功能
  1. 网络通信层

    • 基于 TCP,监听 6379 端口(默认)。
    • 支持 Unix Socket 与 TLS 加密通信。
    • 6.0+ 支持多线程 IO(处理网络读写),但命令执行仍为单线程
  2. 命令处理层

    • 解析 RESP 协议报文。
    • 单线程事件循环(Event Loop)中顺序执行命令。
    • 这种设计避免了锁竞争,也保证了命令的天然原子性。
  3. 内存数据管理

    • 数据存储在 redisDb 字典结构中。
    • 提供多种编码方式(embstr、raw、int、ziplist、listpack、skiplist 等)以节省内存。
    • 内置内存淘汰策略(maxmemory-policy)。
  4. 持久化模块

    • RDB(Redis Database):周期性将内存数据快照保存到 .rdb 文件。
    • AOF(Append Only File):每条写命令追加到 .aof 文件,支持 everysec、always、no 三种刷盘策略。
    • 混合持久化(4.0+):RDB + AOF 结合,启动快且数据丢失少。
  5. 主从复制模块

    • 通过 PSYNC(部分重同步)/ SYNC(全量重同步)实现数据同步。
    • 从节点默认只读,可线性扩展读能力。
  6. 集群模块(Redis Cluster)

    • 数据按哈希槽(共 16384 个)分布。
    • 每个节点负责一部分槽位。
    • 客户端可通过 -c 选项自动重定向(MOVED/ASK 错误)。
    • 节点间通过 Gossip 协议通信。

4.3 Redis 是否可以分布式?

完全可以,而且官方原生支持。Redis 提供两种主流的分布式方案:

方案一:主从 + Sentinel(读写分离 + 高可用)
┌──────────┐ │ Sentinel │ ← 监控 / 自动故障转移 └────┬─────┘ │ ┌────────┴─────────┐ ▼ ▼ ┌────────┐ ┌────────┐ ┌────────┐ │ Master │ ──复制─▶│ Replica│ ◀──复制─│ Replica│ └────────┘ └────────┘ └────────┘
  • 适用场景:数据量不大(< 几十 GB),但需要高可用读写分离
  • 优点:部署简单、运维成本低。
  • 缺点:写性能仍受单主限制,无法水平扩展写能力。
方案二:Redis Cluster(原生分片集群)
┌─────────┐ ← 哈希槽 0-5460 → ┌─────────┐ │ Master A│ │ Master B│ ← 哈希槽 5461-10922 └────┬────┘ └────┬────┘ │ │ ▼ ▼ ┌─────────┐ ┌─────────┐ │Replica A│ │Replica B│ └─────────┘ └─────────┘ ┌─────────┐ ← 哈希槽 10923-16383 → ┌─────────┐ │ Master C│ │ Master D│ └────┬────┘ └────────┬────┘ ▼ ▼ ┌─────────┐ ┌─────────┐ │Replica C│ │Replica D│ └─────────┘ └─────────┘
  • 适用场景:大规模数据(百 GB ~ TB 级),需要水平扩展
  • 优点:去中心化(无 Proxy),线性扩展读 / 写,自动故障转移。
  • 缺点:仅支持单数据库(db 0),多 key 事务支持受限(需保证在同一个哈希槽,使用 hash tag)。
方案三:客户端分片 / Proxy 分片
  • 客户端分片:如 Codis(豌豆荚开源)、Twemproxy(Twitter 开源)等。
  • 现在官方 Cluster 已较为成熟,新项目建议直接使用 Redis Cluster

五、如何通过官方文档学习 Redis

5.1 官方文档地址(核心入口)

类型地址
最新文档(推荐)Docs
按版本归档Docs
命令参考手册Commands | Docs
客户端列表Docs
在线试用https://try.redis.io
教程Dev Hub | Redis
FAQhttps://redis.io/docs/latest/develop/faq/

5.2 推荐学习路线

第一阶段:基础入门
  1. 了解Redis的用处,以及Redis的指令(分组),比如如下图,我们可以看见redis分成了这些命令组(我们可以点击commands的这个filter by group看见),我个人感觉目前这Redis当前版本的Commands文档写的不是特别好,因为这里一列就是一大堆几点几版本引入的特性,或者当前版本都有的特性,我觉得不如直接分类别,然后类别里面再有各种命令,然后命令会显示是几点几版本的,通用哪些模块的。
  2. 阅读 Introduction to Redis:理解 5 种核心数据类型。
  3. 跟随 Redis Tutorial 走一遍:亲手敲 SET、GET、HSET、LPUSH 等命令。
  4. 在本地用 Docker 起一个 Redis:
    docker run -d --name my-redis -p 6379:6379 redis:7.2 docker exec -it my-redis redis-cli
第二阶段:进阶特性
  1. 持久化:阅读 Persistence 文档,理解 RDB 与 AOF 的取舍。
  2. 复制:阅读 Replication,动手搭建一主二从。
  3. 哨兵:阅读 Sentinel,模拟主节点宕机观察自动故障转移。
  4. 集群:阅读 Redis Cluster,用 redis-cli --cluster create 搭建 6 节点集群。
  5. 事务、Lua、Stream:分别阅读对应章节。
第三阶段:生产实战(持续)
  1. 内存管理:阅读 Memory optimization 章节。
  2. 性能调优:阅读 Redis Latency、SLOWLOG、INFO 命令文档。
  3. 安全:阅读 Security(https://redis.io/docs/latest/operate/oss_and_stack/management/security/):密码、ACL、TLS、bind、protected-mode。
  4. 客户端选型:阅读 Clients 章节,结合自己语言选择合适的库。

5.3 三大文档使用技巧

  1. 命令参考(https://redis.io/commands/)是查阅字典:每条命令都有**语法、参数、可用版本、复杂度、返回值、示例**,遇到任何命令都可以来这里查。
  2. How-to / Tutorial(https://redis.io/learn/)是手把手教程:通过具体场景(如 API 网关缓存、实时排行榜)学会组合命令。
  3. Operate / Reference(https://redis.io/docs/latest/operate/)是运维手册:讲部署、监控、备份、升级、迁移。

5.4 必读核心文档清单(最少必要知识)

  • Data Types 章节(5 大数据结构)
  • Commands 章节(按需查阅)
  • Persistence 章节
  • Replication 章节
  • Redis Cluster Tutorial(强烈推荐)
  • ACL 章节(6.0+ 必看)
  • Modules 章节(按需扩展)

5.5 其他优质学习资源

  • Redis University:Flockjay (官方免费课程,含 RU101、RU102、RU202 等)
  • 源码阅读:https://github.com/redis/redis (建议从 server.c、dict.c、networking.c 入手)
  • 《Redis 设计与实现》(黄健宏著):中文经典,结合源码讲解内部机制
  • 《Redis 实战》(Josiah L. Carlson):偏应用场景
  • Redis 官方博客:Redis Blog - Read about what’s happening at Redis (跟踪新版本特性)

六、总结

维度要点
是什么高性能内存 KV 数据库,支持丰富数据结构
特性快、丰富数据结构、持久化、高可用、分布式、模块化
应用缓存、计数器、排行榜、分布式锁、消息队列、限流、社交、实时分析
架构C/S 模式,基于 RESP 协议通信
客户端redis-cli、RedisInsight、各语言 SDK
服务端单线程事件循环 + 多模块(持久化、复制、集群、ACL、模块)
分布式✅ 原生支持(Sentinel 高可用 + Cluster 分片)
怎么学官方文档 + Redis University + 源码 + 实战

Redis 的精髓在于:把简单做到极致——单线程命令执行 + 内存数据结构 + RESP 协议 = 极简且强大。