一、Redis简介
(一)什么是Redis?
Redis(Remote Dictionary Server)是一款基于内存的高性能 Key-Value NoSQL 数据库,支持持久化,提供丰富的数据结构与多种高级特性。得益于其基于内存读写的特性,Redis 能够提供极高的吞吐量与低延迟,广泛应用于缓存、分布式锁、消息队列、Session 管理等业务场景。
(二)Redis的数据结构
Redis 具备多种高效的数据结构,常用如下:
String(字符串):最常见的数据类型,可存储文本或数字。
Hash(哈希表):类似于键值对象,适合存储结构化数据。
List(列表):有序字符串列表,支持 push/pop 等操作,常用于消息队列。
Set(无序集合):不重复的字符串集合,支持交并差集运算。
Sorted Set(有序集合):每个成员都有一个 score,可按 score 排序,常用于排行榜。
(三)Redis的核心特性
**安全性机制:**密码认证、ACL(访问控制列表)
**多种数据结构:**内置十余种核心与高级数据结构。
**事务机制:**支持 multi/exec,保证命令的原子性。
**持久化支持:**RDB、AOF 两种持久化方式确保数据安全。
**主从复制(Replication):**实现数据冗余、读写分离、负载均衡。
**哨兵(Sentinel):**实现主从故障检测与自动主备切换。
**集群(Cluster):**实现分布式存储与高可用。
**Lua 脚本执行:**在服务端执行脚本,提高复杂业务的原子性与效率。
**慢查询日志(Slowlog):**帮助分析性能瓶颈。
(四)Redis 的安装与环境准备
以下操作基于 Ubuntu。
1. 下载 Ubuntu 镜像
https://ubuntu.com/download/desktop
下载完成之后选择虚拟机的ISO映像文件
2. 获得ip
3. 配置 SSH,方便通过 MobaXterm 登录
sudo apt update
sudo apt install openssh-server -y
sudo systemctl enable ssh
sudo systemctl start ssh
更新软件源
安装 SSH 服务
设置 SSH 服务开机自启
立即启动 SSH 服务
确保 Ubuntu 能被 MobaXterm 正常 SSH 登录。
4. 安装Redis
Ubuntu 官方源提供 Redis,可直接安装:
sudo apt update
sudo apt install redis-server -y
检查 Redis 服务状态:
sudo systemctl status redis-server
如果看到 active (running),说明已经成功运行了。
测试 Redis 是否可用:
redis-cli
出现:
127.0.0.1:6379>
说明成功进入 Redis。
可以使用keys *来查看当前redis下有多少个key
添加相应的key,测试
二、Redis 主从部署(Master-Slave Replication)
(一)主从复制概念(读写分离、负载均衡基础)
主从复制(Master-Slave Replication)指的是:将一台 Redis 服务器的数据,自动同步到另一台或多台 Redis 服务器。
其中:
主节点(Master):负责处理所有写操作,并把数据同步给从节点
从节点(Slave):只能读,不能写,负责复制并保持与主节点的数据一致
数据同步是单向的,只能从主节点 → 从节点。默认情况下,每个 Redis 启动时都是主节点。从节点只能指定一个主节点,但一个主节点可以拥有多个从节点。
(二)主从复制的意义
主从结构带来了多方面的优势:
1. 数据冗余
在持久化机制之外,再提供一份"热备份"数据,提高数据安全性。
2. 故障恢复
当主节点宕机时,从节点可继续提供读服务,人工或借助哨兵实现快速恢复。
3. 负载均衡(读写分离)
主库处理写操作
从库承担读操作
特别是"多读少写"的业务场景,可通过扩展从库显著提升系统的吞吐量。
4. 高可用架构的基础
Redis Sentinel(高可用)和 Redis Cluster(分布式)都依赖主从复制,因此主从搭建是 Redis 高可用体系的基础环节。
(三)主从复制的缺点
1. 复制延迟
所有写入都必须先在主节点执行,然后异步同步给从节点。
当 Redis 压力较大时,从节点数据会出现滞后;从节点越多,延迟越明显。
2. 主节点宕机无法自动切换
默认情况下,从节点不会自动提升为主节点,故障时必须人工处理(使用 Sentinel 才能自动化)。
(四)主从部署实操(单机模拟 1 主 2 从)
以下示例在同一台机器上运行 3 个 Redis 实例:
主节点:6380
从节点:6381、6382
因此,每个实例都需要自己的配置文件和数据目录。
1.创建相应目录

2. 创建主节点(master)
(1)创建配置文件
nano redis.conf
写入:
port 6380
daemonize no
dir /home/xiaoman/software/redis/master
appendonly yes
配置项说明
1)port 6380
Redis 的服务端口。多个实例必须使用不同端口。
2)daemonize no
是否后台运行:
no:前台模式(窗口被占用)
yes:后台模式(推荐生产环境)
如需后台运行,可改为:
daemonize yes
3)dir ...
Redis 工作目录,AOF、RDB 文件会写在这里,目录必须事先创建。
4)appendonly yes
开启 AOF 持久化,提高数据可靠性。
退出并保存:
Ctrl + X
Y
回车
(2)启动主节点(前台运行)
redis-server redis.conf
2. 创建从节点(slave1)
nano ~/software/redis/slave1/redis.conf
写入:
port 6381
daemonize no
slaveof 127.0.0.1 6380
dir /home/xiaoman/software/redis/slave1
appendonly yes
启动:
redis-server ~/software/redis/slave1/redis.conf
3. 创建从节点(Slave 2)
nano ~/software/redis/slave2/redis.conf
写入:
port 6382
daemonize no
slaveof 127.0.0.1 6380
dir /home/xiaoman/software/redis/slave2
appendonly yes
启动:
redis-server ~/software/redis/slave2/redis.conf
(五)为什么需要单独的 redis.conf?
因为你运行多个 Redis 实例,必须做到:
端口不同(6380 / 6381 / 6382)
工作目录不同(避免文件冲突)
配置 slaveof(从库必须指定主库)
不能共用系统默认配置文件
否则实例会发生冲突无法启动。
(六)验证主从复制是否成功
1. 查看主节点复制信息
redis-cli -p 6380 info replication
可以看到从节点的状态。
2.进一步验证复制功能
在 master(6380)上 set 一个 key
redis-cli -p 6380 set name cheng
让redis后台运行,把daemonize 改为 yes
3. 查看 slave1(6381)是否同步到数据
redis-cli -p 6381 get name
4. 查看 slave2(6382)是否同步到数据
redis-cli -p 6382 get name
两个slave节点都返回了"cheng",说明主从复制成功。
每个 Redis 实例必须端口不同,否则会冲突
如果 master 用 daemonize no,终端会被占用,需要另开窗口做 redis-cli 测试
从节点必须先启动,并配置 replicaof <master-ip> <master-port>
(七)验证从节点不能写
尝试写入从节点:
redis-cli -p 6381 set test_slave_write 1
redis-cli -p 6382 set test_slave_write 1
从节点会报错,说明只读状态生效。
三、哨兵部署(Sentinel)
主从复制虽然能够提供数据冗余和读负载分担,但并不能真正实现高可用。一旦主节点(Master)宕机,主从架构本身不会自动完成主备切换,需要人工介入。因此 Redis 引入了 哨兵模式(Sentinel) 来实现故障监控和自动主从切换。
(一)哨兵模式的工作原理
哨兵模式通过运行在独立节点上的哨兵进程,对 Redis 主从架构进行实时监控,并在主节点故障时执行自动化的故障转移(failover)。
哨兵主要负责四项工作:
1. 哨兵自身的选举(Leader 选举)
哨兵启动后,多个哨兵通过选举机制确定一个领导者(Leader Sentinel),由其负责协调故障转移。
选举流程说明:
每个哨兵可以请求成为 leader,并向其他哨兵发送 is-master-down-by-addr 请求。
其他哨兵会根据自身判断决定是否投票同意。
当某个哨兵获得的票数 ≥ sentinel 总数/2 + 1 时,它被选为 leader。
若未达成多数票,则继续选举。
2. 监控主从节点状态
哨兵会周期性发送命令检查 Redis 主节点和从节点的健康状况,包括:
主节点是否可用;
从节点是否正常同步;
网络延迟是否在可接受范围。
当一个哨兵判断 master 无响应,它认为 master 主观下线(SDown)。
3. 故障转移(Failover)
当多个哨兵共同确认 master 已经不可用(达到 quorum),master 将被标记为客观下线(ODown),leader 哨兵会开始执行故障转移流程:
故障转移步骤:
(1)过滤掉不健康的 slave;
(2)优先选择:
从节点优先级最高;
数据同步最完整(复制偏移量最大)的从节点;
(3)将其升级为新的 master;
(4)让其他 slave 自动指向新 master;
(5)更新哨兵集群中的 master 信息。
这一过程完全自动完成,无需人工干预。
4. 客户端重定向
故障转移完成后:
哨兵会通知客户端新的 master 地址;
客户端只需连哨兵,不需要关心 master 的具体位置;
这保证了 master 切换后客户端仍能正常访问。
(二)哨兵部署步骤
目前的环境已经有了:
| 端口 | 用途 |
|---|---|
| 6380 | Redis master |
| 6381 | Redis slave1 |
| 6382 | Redis slave2 |
下面开始创建 3 个哨兵节点。
1. 创建目录
mkdir -p /home/xiaoman/software/redis/sentinel
cd /home/xiaoman/software/redis/sentinel
2. 创建三个哨兵配置文件
(1) sentinel1.conf(端口 26379)
port 26379
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
(2)sentinel2.conf(端口 26380)
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
(3)sentinel3.conf(端口 26381)
port 26381
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
3. 启动哨兵
进入目录:
cd /home/xiaoman/software/redis/sentinel
启动三个哨兵:
redis-server sentinel1.conf --sentinel
redis-server sentinel2.conf --sentinel
redis-server sentinel3.conf --sentinel
终端会看到哨兵成功启动并开始监控 master
(三)哨兵模式测试
测试1:查看监控信息
运行:
redis-cli -p 26379 sentinel master mymaster
主要字段说明:
| 字段 | 当前值 | 说明 |
|---|---|---|
name |
"mymaster" |
master 的名字(哨兵监控的标识) |
ip |
"127.0.0.1" |
master IP |
port |
"6380" |
master 端口 |
flags |
"master" |
master 的角色标志,目前状态正常为 master |
num-slaves |
2 |
这个 master 下面有 2 个从节点(6381、6382) |
num-other-sentinels |
2 |
除了当前哨兵,还有另外 2 个哨兵在监控这个 master |
quorum |
2 |
达到 quorum 才会进行 failover(你配置的 2) |
failover-timeout |
60000 |
自动 failover 的超时时间(ms) |
parallel-syncs |
1 |
failover 时从节点与 master 并行同步数量 |
当前返回信息显示 master 6380 健康,两个从节点正常,三个哨兵互相通信正常
测试2:手动杀死 master,看是否自动切换
停止 master 6380:
redis-cli -p 6380 shutdown
观察哨兵日志(26379/26380/26381):
先检测到主观下线(SDown)
多个哨兵确认后标记为客观下线(ODown)
哨兵选举 leader
leader 选择新 slave 作为 master
测试3:确认新的主节点是谁
redis-cli -p 26379 sentinel master mymaster
输出为:
测试4:从节点自动跟随新master
查看redis信息(查看6381):
redis-cli -p 6381 info replication

测试 5:客户端自动切换验证
客户端不需要直接连 master,而是查询哨兵:
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
master 切换后,这里会自动返回新的 master 地址 ------ 客户端自动修复成功。
为什么客户端要连接到 26379?
因为哨兵的功能是:
监控 master 状态
在 master 宕机后执行 failover
告诉客户端当前的 master 是谁
所以客户端不应该直接连 Redis master(因为 master 会变),而应该连哨兵。
三、Redis 集群部署(Cluster)
Redis Cluster 是 Redis 官方提供的分布式部署方式,通过 分片(Sharding)+ 主从复制 + 自动故障转移,实现:
大数据量存储(突破单机内存限制)
高吞吐读写能力(多主节点并行处理)
高可用(主节点故障自动切换)
一个 Redis Cluster 至少需要 3 个 master 节点 (负责写入),并通常为每个 master 配备一个 slave,实现 三主三从架构。
(一)Redis 集群的作用
1. 数据分区(分片)
Redis Cluster 使用 分片(Sharding) 机制,将数据分散到多个主节点中:
Redis 将整个 key 空间划分为 16384 个槽(slot 0--16383)
每个 master 会分配到一定范围的槽
键值通过 CRC16(key) % 16384 决定落在哪个槽
示例(三主集群):
| 节点 | 负责的槽范围 |
|---|---|
| Master A | 0--5460 |
| Master B | 5461--10922 |
| Master C | 10923--16383 |
优势:突破单机内存限制、多主节点并行读写。
2. 高可用(自动故障转移)
Redis Cluster 内置高可用能力:
每个 master 都可以有对应的 slave
master 宕机后,由 slave 自动升级为新的 master
自动恢复服务,无需人工干预
示例结构:
| 主节点 | 从节点 |
|---|---|
| A | A1 |
| B | B1 |
| C | C1 |
如果 B 宕机 → B1 自动升级为 master。
若 B 和 B1 都宕机 → Cluster 不可用(因为缺少槽位)。
(二)Redis 集群分片机制
Redis Cluster 定义 16384 个哈希槽(hash slots):
写入 key 时先计算 CRC16 值
再与 16384 取余
根据余数找到对应槽,从而知道属于哪个节点
例如:
key = "name"
CRC16("name") = X
slot = X % 16384
集群根据槽分布自动跳转存取目标节点。
(三)Redis 集群部署步骤(三主三从)
目录结构如下:
cluster/
master1-7000/
slave1-7001/
master2-7002/
slave2-7003/
master3-7004/
slave3-7005/
1. 创建目录
mkdir -p /home/xiaoman/software/redis/cluster/master1-7000
mkdir -p /home/xiaoman/software/redis/cluster/slave1-7001
mkdir -p /home/xiaoman/software/redis/cluster/master2-7002
mkdir -p /home/xiaoman/software/redis/cluster/slave2-7003
mkdir -p /home/xiaoman/software/redis/cluster/master3-7004
mkdir -p /home/xiaoman/software/redis/cluster/slave3-7005
2. 创建 6 个 Redis 配置文件
(1)master1-7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1
(2)slave1-7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1
(3)master2-7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1
(4)slave2-7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1
(5)master3-7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes-7004.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1
(6)slave3-7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes-7005.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1
注意:所有节点都启用 cluster-enabled yes,并且 daemonize yes,方便后台运行。
3. 启动六个节点
redis-server /home/xiaoman/software/redis/cluster/master1-7000/redis.conf
redis-server /home/xiaoman/software/redis/cluster/slave1-7001/redis.conf
redis-server /home/xiaoman/software/redis/cluster/master2-7002/redis.conf
redis-server /home/xiaoman/software/redis/cluster/slave2-7003/redis.conf
redis-server /home/xiaoman/software/redis/cluster/master3-7004/redis.conf
redis-server /home/xiaoman/software/redis/cluster/slave3-7005/redis.conf
检查 Redis 是否真的启动成功
执行
ps -ef | grep redis
4. 创建 Redis 集群
redis-cli --cluster create \
127.0.0.1:7000 \
127.0.0.1:7002 \
127.0.0.1:7004 \
127.0.0.1:7001 \
127.0.0.1:7003 \
127.0.0.1:7005 \
--cluster-replicas 1
上述命令含义:
前 3 个是 master
后 3 个自动成为各自对应 master 的 slave
--cluster-replicas 1 → 每个 master 分配一个从节点
输入 yes 即可
使用 redis-cli 自动创建配置文件的方式
redis-cli --cluster create ... --cluster-replicas 1 --cluster-yes
可避免输入 yes
(四)集群测试
1. 写入测试
redis-cli -c -p 7000 set name cheng
-c:表示使用 cluster 模式,会自动跳转槽位所在节点。
看到ok就代表写入成功。
2. 测试数据是否被自动路由到槽位(slot 跳转)
使用 slave 或其他节点读:
redis-cli -c -p 7003 get name
必须带 -c,因为 cluster 模式会自动重定向(MOVE)。
如果返回 cheng 即正常
3. 查看 key 属于哪个槽位
redis-cli -p 7000 cluster keyslot name
4. 查看槽位分布
redis-cli -p 7000 cluster slots
会看到 3 个 master 分别分到 0--5460,5461--10922,10923--16383。
因为 Redis Cluster 的槽位(slots)是固定的 16384 个,集群有 3 个 master,Redis 会自动把这 16384 个槽平均分成 3 份。
为什么会平均分?
因为创建集群的时候执行了 redis-cli --cluster create ... --cluster-replicas 1
5. 查看节点角色(master/slave)
redis-cli -p 7000 cluster nodes
可以看到:
7000、7002、7004 是 master
7001、7003、7005 是 slave
(五)集群故障转移测试
1. 杀掉一个master
例如 kill master 7000:
ps -ef | grep 7000
kill -9 <pid>
或者
redis-cli -p 7000 shutdown
2. 检查是否有自动 failover
查看 slave 是否被提升为新的 master:
redis-cli -p 7001 cluster nodes
可以看到slave 自动接管说明集群正常
3. 再重新启动旧 master,看是否自动变成 slave
重新启动 7000 节点:
redis-server /home/xiaoman/software/redis/cluster/master1-7000/redis.conf
查看角色:
redis-cli -p 7003 cluster nodes
旧 master 会 自动降级为 slave。
(六)集群健康状态检查
redis-cli -p 7000 cluster info
cluster_state
ok:集群正常
fail:集群不可用(主节点缺失或槽位不完整)
cluster_slots_assigned / cluster_slots_ok
Redis 总共有 16384 个槽位
两者都为 16384 表示所有槽位正常分配
cluster_slots_pfail / cluster_slots_fail
pfail:主观下线(可能故障)
fail:客观下线(多数节点判定故障)
都应为 0,否则集群可能不可用
cluster_known_nodes
集群已识别的节点数量
典型 3 主 3 从集群应为 6
cluster_size
主节点数量(masters)
此处为 3
cluster_current_epoch / cluster_my_epoch
集群的版本号,用于处理 failover
递增正常,无需特别关注
cluster_stats_messages_sent / received
节点之间发送的心跳消息(ping/pong)
数值对称说明节点通信正常
total_cluster_links_buffer_limit_exceeded
通信 buffer 是否溢出
0 为最佳状态,大于 0 表示可能出现网络延迟或阻塞
四、总结
本文梳理了 Redis 在不同业务规模下的典型部署方式,包括安装、主从复制、Sentinel 哨兵机制以及 Cluster 集群架构。随着业务对高可用性与可扩展性的要求不断提升,Redis 的部署也呈现出由简单到复杂、由单节点到分布式的演进路径。
单机模式 是 Redis 的基础形态,部署简单,但不具备容错能力。
主从复制 提供数据冗余与读写分离机制,但仍然无法解决主节点故障带来的服务不可用风险。
Sentinel 哨兵 在主从架构基础上引入自动故障转移能力,实现了高可用部署,是生产环境常用方案。
Cluster 集群 则通过槽位(slot)分片机制实现水平扩展,在保证高可用的同时支持大规模数据存储与高吞吐访问。
通过对以上模块的逐步构建,可以形成一个从基础可用、高可用到分布式可扩展的完整 Redis 架构体系。