一、Redis 主从复制(Replication)
1. 复制流程
主从复制的核心流程分为三步:
-
从节点发起同步请求 :从节点向主节点发送
SYNC命令,请求数据同步。 -
主节点生成并发送 RDB 文件 :主节点收到
SYNC后,执行BGSAVE生成 RDB 快照文件,并发送给从节点;同时缓存此期间的新写命令。 -
主节点发送增量命令:RDB 传输完成后,主节点将缓存的增量写命令发送给从节点,之后持续同步新命令,保持数据一致。
2. 配置步骤
-
主节点:无需额外配置(默认开启主节点模式)。
-
从节点 :在从节点的
redis.conf中配置,或通过命令行临时设置:slaveof <master_ip> <master_port>例如:
slaveof 192.168.61.131 6379。
3. 功能测试
-
数据同步验证 :向主节点写入数据(如
SET test_key 123),观察从节点是否能通过GET test_key获取到相同数据。 -
故障场景验证 :关闭主节点(
SHUTDOWN),此时从节点会进入只读模式,无法写入数据(文档中提到"主死了从只能读",这是 Redis 主从复制的默认行为------从节点默认slave-read-only yes)。
二、Redis 集群(Cluster)
1. 核心机制解析
(1)节点间为何相互 Ping-Pong?
Redis 集群采用 Gossip 协议 ,节点之间通过定期发送 PING(心跳检测)和接收 PONG(响应)消息,交换节点状态(在线/离线、槽位分配等),实现集群状态的分布式感知。
(2)为何需要检测故障节点?
Redis 集群采用 去中心化架构,但依赖"多数派投票"机制判断节点故障。若某个主节点宕机且未及时检测,其负责的槽位将无法访问,导致集群整体不可用(文档中"集群中有一个节点挂了整个群都挂了"的描述需注意:实际是"负责槽位的主节点宕机且无可用的从节点升级"时才会不可用)。
(3)客户端为何能连接任意节点?
Redis 集群将所有数据划分为 16384 个哈希槽(Slot) ,每个主节点负责一部分槽位。客户端存取数据时,通过 CRC16(key) % 16384计算 key 对应的槽位,再根据槽位与节点的映射关系,自动重定向到正确的节点(即使客户端连接非目标节点,也会返回 MOVED重定向指令)。
(4)集群最少需要多少节点?
-
投票容错:判断节点故障需超过半数节点同意,因此至少需要 3 个主节点(3 个节点投票时,2 票即可超过半数)。
-
高可用要求 :为保证故障时从节点能升级为主节点,通常每个主节点至少配 1 个从节点,因此最小高可用集群为 3 主 3 从(共 6 个节点)。
2. 集群搭建步骤(以 6 节点为例)
(1)准备环境
-
删除原 Redis 实例的持久化文件(避免旧数据干扰):
cd /usr/local/redis/bin rm -f dump.rdb appendonly.aof
(2)开启集群模式
修改每个节点的 redis.conf:
cluster-enabled yes # 开启集群模式
cluster-config-file nodes-7001.conf # 集群配置文件(自动生成)
cluster-node-timeout 15000 # 节点超时时间(毫秒)
(3)创建 6 个节点目录
cd /usr/local
cp -r redis redis-cluster/redis-7001
cp -r redis redis-cluster/redis-7002
# 同理复制 7003~7006
(4)修改各节点端口
分别编辑每个节点的 redis.conf,设置不同端口:
port 7001 # 7002~7006 依次修改
(5)编写启动脚本
创建 start-all.sh批量启动节点:
cd /usr/local/redis-cluster
vim start-all.sh
# 内容如下:
cd redis-7001/bin && ./redis-server redis.conf
cd ../redis-7002/bin && ./redis-server redis.conf
# 同理添加 7003~7006
chmod 755 start-all.sh
./start-all.sh
ps -ef | grep redis # 验证进程
(6)安装 Ruby 环境(旧版 Redis 依赖)
Redis 3.x 集群搭建需通过 Ruby 脚本 redis-trib.rb,需安装 Ruby 及依赖:
yum install ruby rubygems
gem install redis-3.0.0.gem # 需提前下载对应版本的 redis.gem
(7)执行集群创建脚本
使用 redis-trib.rb初始化集群(--replicas 1表示每个主节点配 1 个从节点):
cd /usr/upload/redis-3.0.0/src
./redis-trib.rb create --replicas 1 \
192.168.61.131:7001 192.168.61.131:7002 192.168.61.131:7003 \
192.168.61.131:7004 192.168.61.131:7005 192.168.61.131:7006
(8)集群测试
-
数据存取 :使用
-c参数开启集群模式连接:./redis-cli -c -p 7001 SET test_key "hello cluster" # 自动重定向到对应槽位节点 GET test_key -
高可用验证:查看集群节点状态:
cluster nodes # 显示所有节点角色(master/slave)、槽位、状态关闭主节点(如 7001)后,再次执行
cluster nodes,可观察到从节点(如 7004)升级为新主节点。
三、Redis 五种数据类型及常用命令
| 数据类型 | 赋值命令 | 取值命令 | 删除命令 | 核心特点 |
|---|---|---|---|---|
| String | SET key value |
GET key |
DEL key |
二进制安全,最大 512MB |
| Hash | HSET key field value |
HGET key field |
HDEL key field |
键值对集合,适合存储对象 |
| List | LPUSH/RPUSH key v1 v2 |
LRANGE key 0 -1(全量) |
LREM key count v |
双向链表,支持头尾操作 |
| Set | SADD key v1 v2 |
SMEMBERS key(无序) |
SREM key v |
无序不重复集合,支持交集并集 |
| ZSet | ZADD key score v |
ZRANGE key 0 -1 WITHSCORES |
ZREM key v |
有序集合(按 score 排序) |
四、注意事项(文档补充与修正)
-
主从复制的"从节点只读" :Redis 2.6+ 版本默认
slave-read-only yes,可通过配置关闭,但不建议(避免数据不一致)。 -
集群故障容错:文档中"集群中有一个节点挂了整个群都挂了"不准确,实际是"负责槽位的主节点宕机且无从节点升级"时才会不可用;若主节点有从节点,从节点会自动晋升。
-
Ruby 脚本的替代方案 :Redis 5.0+ 已内置
redis-cli --cluster命令,无需依赖 Ruby,例如:redis-cli --cluster create 192.168.61.131:7001 ... --cluster-replicas 1