Redis 核心知识梳理:主从复制、集群搭建与数据类型详解(二)

一、Redis 主从复制(Replication)

1. 复制流程

主从复制的核心流程分为三步:

  1. 从节点发起同步请求 :从节点向主节点发送 SYNC命令,请求数据同步。

  2. 主节点生成并发送 RDB 文件 :主节点收到 SYNC后,执行 BGSAVE生成 RDB 快照文件,并发送给从节点;同时缓存此期间的新写命令。

  3. 主节点发送增量命令: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 排序)

四、注意事项(文档补充与修正)

  1. 主从复制的"从节点只读" :Redis 2.6+ 版本默认 slave-read-only yes,可通过配置关闭,但不建议(避免数据不一致)。

  2. 集群故障容错:文档中"集群中有一个节点挂了整个群都挂了"不准确,实际是"负责槽位的主节点宕机且无从节点升级"时才会不可用;若主节点有从节点,从节点会自动晋升。

  3. Ruby 脚本的替代方案 :Redis 5.0+ 已内置 redis-cli --cluster命令,无需依赖 Ruby,例如:

    复制代码
    redis-cli --cluster create 192.168.61.131:7001 ... --cluster-replicas 1
相关推荐
小虾米vivian2 小时前
达梦数据库的大表快速加列方法
数据库
Lhan.zzZ2 小时前
Qt多线程数据库操作:安全分离连接,彻底解决段错误
数据库·c++·qt·安全
s1mple“”2 小时前
大厂Java面试实录:从Spring Boot到AI技术的面试场景深度解析
spring boot·redis·微服务·kafka·java面试·rag·ai技术
攒了一袋星辰2 小时前
类抖音的高并发评论盖楼系统
服务器·前端·数据库
2601_949817722 小时前
使用Django Rest Framework构建API
数据库·django·sqlite
星晨雪海3 小时前
缓存更新操作实例
java·spring·缓存
liulilittle3 小时前
SQLITE3 KG-CC
数据库·c++·sqlite
hnlgzb3 小时前
安卓app体系中,room数据库和datastore是什么关系?有什么不一样?
android·数据库·oracle
book_longker3 小时前
postgresql 数据库的安装,配置,备份,恢复
数据库·postgresql