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
相关推荐
Elastic 中国社区官方博客7 小时前
搜索倍增器:推动收入、生产力和 AI 实现规模化
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
保定公民9 小时前
达梦数据库存储过程中的数组类型详解:基础数组与记录数组的差异化应用
数据库·达梦·存储过程·达梦数据库·dm8·dm
梦Arrebol9 小时前
Redis 内容及相关实验
数据库·redis
大模型码小白10 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
DBA大董11 小时前
TDengine3.0 DBA常用的运维命令和SQL2
运维·数据库·时序数据库·dba·tdengine
ManageEngineITSM12 小时前
什么是CMDB?配置管理数据库的定义、作用与建设方法一文讲清
大数据·数据库·人工智能·资产管理·变更管理
IvorySQL12 小时前
PostgreSQL 日报|PG19 外键快速路径隐患已修复(8 月 23 日)
数据库·postgresql
Elastic 中国社区官方博客12 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch
只爱喝胡辣汤13 小时前
Redis Intset(整数集合)技术文档
redis