Redis(59)Redis的主从复制是如何实现的?

作者:Victor356日期:2025/10/13

Redis 的主从复制(Master-Slave Replication)是一种数据复制机制,通过它可以将一个 Redis 实例的数据复制到一个或多个从节点。这种机制可以用于数据备份、读写分离、灾难恢复等场景。以下是 Redis 主从复制的详细实现过程及其代码示例。

主从复制原理

  1. 主节点(Master):负责处理写操作(SET、DEL 等),并将数据变化同步到从节点。
  2. 从节点(Slave):负责处理读操作(GET 等),从主节点接收数据变化。
  3. 同步过程
    • 初次同步:从节点连接到主节点,主节点会将当前数据快照发送给从节点,从节点在接收到快照后会进行数据加载。
    • 增量同步:在初次同步完成后,主节点会将所有新的写操作日志发送给从节点,从节点会持续应用这些操作以保持数据一致性。

配置主从复制

配置主节点

redis.conf 文件中,通常不需要进行特殊配置,只需要确保主节点正常运行即可。

配置从节点

redis.conf 文件中,添加如下配置,以指定主节点的 IP 地址和端口:

1replicaof <master-ip> <master-port>
2# 例如
3replicaof 192.168.1.100 6379
4

动态配置从节点

也可以在 Redis 运行时通过命令配置从节点:

1redis-cli REPLICAOF <master-ip> <master-port>
2# 例如
3redis-cli REPLICAOF 192.168.1.100 6379
4

如果需要将一个从节点转换回独立状态(停止复制),可以使用:

1redis-cli REPLICAOF NO ONE
2

Java 和 Jedis 实现主从复制

使用 Jedis 库可以通过编程接口实现 Redis 的主从复制配置。

  1. 添加 Jedis 依赖

确保在 pom.xml 文件中添加 Jedis 依赖:

1<dependency>
2    <groupId>redis.clients</groupId>
3    <artifactId>jedis</artifactId>
4    <version>4.2.3</version>
5</dependency>
6
  1. Java 示例代码

以下代码展示了如何使用 Jedis 库配置 Redis 主从复制:

1import redis.clients.jedis.Jedis;
2
3public class RedisReplicationExample {
4    public static void main(String[] args) {
5        // 主节点配置
6        String masterHost = "192.168.1.100";
7        int masterPort = 6379;
8
9        // 从节点配置
10        String slaveHost = "192.168.1.101";
11        int slavePort = 6379;
12
13        // 连接主节点
14        try (Jedis masterJedis = new Jedis(masterHost, masterPort)) {
15            masterJedis.set("key", "value");
16            System.out.println("Master set key: " + masterJedis.get("key"));
17        }
18
19        // 配置从节点
20        try (Jedis slaveJedis = new Jedis(slaveHost, slavePort)) {
21            slaveJedis.slaveof(masterHost, masterPort);
22            System.out.println("Slave is replicating from Master");
23
24            // 等待复制完成
25            Thread.sleep(1000);
26
27            // 从节点读取数据
28            String value = slaveJedis.get("key");
29            System.out.println("Slave get key: " + value);
30        } catch (InterruptedException e) {
31            e.printStackTrace();
32        }
33    }
34}
35

监控和故障处理

  1. 监控同步状态

使用命令 INFO replication 可以查看主节点和从节点的复制状态:

1# 在主节点上
2redis-cli INFO replication
3
4# 在从节点上
5redis-cli INFO replication
6

输出示例:

1# 在主节点上
2# Replication
3role:master
4connected_slaves:1
5slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0
6
7# 在从节点上
8# Replication
9role:slave
10master_host:192.168.1.100
11master_port:6379
12master_link_status:up
13master_last_io_seconds_ago:0
14master_sync_in_progress:0
15slave_repl_offset:12345
16
  1. 处理主节点故障

在实际生产环境中,可能需要使用 Redis Sentinel 或 Redis Cluster 来实现高可用性和自动故障转移。

  • Redis Sentinel:用于监控 Redis 主从架构的高可用性解决方案,可以自动进行主从切换。
  • Redis Cluster:用于分布式 Redis 集群,实现高可用性和水平扩展。

使用 Redis Sentinel 进行高可用性配置

  1. 配置 Sentinel

创建一个 sentinel.conf 文件,配置 Sentinel 以监控主节点:

1sentinel monitor mymaster 192.168.1.100 6379 2
2sentinel down-after-milliseconds mymaster 5000
3sentinel parallel-syncs mymaster 1
4sentinel failover-timeout mymaster 10000
5
  1. 启动 Sentinel
1redis-server /path/to/sentinel.conf --sentinel
2
  1. 使用 Jedis 进行连接

可以使用 JedisSentinelPool 来连接 Sentinel 和 Redis 集群:

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.JedisSentinelPool;
3
4import java.util.HashSet;
5import java.util.Set;
6
7public class RedisSentinelExample {
8    public static void main(String[] args) {
9        Set<String> sentinels = new HashSet<>();
10        sentinels.add("192.168.1.101:26379");
11
12        try (JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
13             Jedis jedis = pool.getResource()) {
14            jedis.set("key", "value");
15            System.out.println("Set key: " + jedis.get("key"));
16        }
17    }
18}
19

总结

Redis 主从复制是一种重要的数据备份和读写分离机制。通过合理配置主从节点,可以实现数据的高可用性和负载均衡。在实际应用中,结合 Redis Sentinel 或 Redis Cluster 可以进一步提高系统的高可用性和容灾能力。通过本文的详细介绍和代码示例,希望能帮助您更好地理解和实现 Redis 的主从复制功能。


Redis(59)Redis的主从复制是如何实现的?》 是转载文章,点击查看原文


相关推荐


全面解析java注解
学到头秃的suhian2025/10/11

一.注解的定义与分类 注解的概念: Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法 JDK自带注解: @Override  代表子类重写父类的方法 @Deprecated  代表该方法已经过时 @SuppressWarning 代表忽略警告Warnings 注解的分类: 源码注解:注解只在源码中存在,编译成.class文件就不存在了编译时注解:注解在源码和.class文件中都存在(@Override,@Deprecated这些都是)运行时注解


Python 的内建函数
hubenchang05152025/10/9

#Python 的内建函数 此文档创建于 Python 3.13,可能未及时更新,请以 Python 官方文档 为准。 虽然称为内建函数,但部分 API 并不是函数,例如 object 是类。 函数名详情简介__import__查看导入模块abs查看计算绝对值aiter查看获取异步可迭代对象的迭代器all查看判断可迭代对象内容是否全部为真值anext查看获取异步迭代器的下一数据项any查看判断可迭代对象内容是否存在真值ascii查看转换为字符串,非 ASCII 字符将被转义bin查看将一


如何使用 INFINI Gateway 对比 ES 索引数据
极限实验室2025/10/8

上一篇我们通过 极限网关(INFINI Gateway) 进行了索引数据迁移,对索引迁移结果进行了初步且直观的校验,既对比索引的文档数是否一致。今天介绍个实实在在的数据比对方法,通过网关对比索引文档的内容在两个集群是否一致,此方法适用于 Elasticsearch、Easysearch、Opensearch。话不多说,就拿上次迁移的两个索引开整。 测试环境 软件版本Easysearch1.12.0Elasticsearch7.17.29INFINI Ga


从0-1建设数据仓库
DashingGuy2025/10/7

基于onedata,纯个人理解,不完善的会慢慢补充 整体流程 业务调研数据调研划分数据域构建总线矩阵数仓模型设计数仓模型开发数仓模型质量保障以及运维 一、业务调研 业务调研有几个内容要做: 确定目标和范围、收集业务需求、梳理业务流程和数据流向、输出物 1.1 确定目标和范围 明确业务目标:为什么建设数仓?数仓要解决什么问题?要实现哪些业务目标?例如提升数据分析能力、提高经营效率、支持精准营销、预测风险等。 确定数仓范围:数仓要包含哪些业务领域?哪些数据需要纳入数仓?需要支持哪些业务场景?例


在高并发场景下,如何平衡QPS和TPS的监控资源消耗?
IT橘子皮2025/10/5

在高并发场景下,平衡QPS(每秒查询数)和TPS(每秒事务数)的监控资源消耗,需要从监控策略、工具选型、资源分配及优化手段等多维度进行综合设计。以下是具体方案: 一、分层监控策略 ​轻量级采样与聚合​ ​高频QPS监控​:对简单请求(如API调用)采用低精度采样(如每10秒聚合一次),通过Prometheus的rate()函数计算QPS趋势,减少实时采集压力。 ​低频TPS监控​:对复杂事务(如支付流程)采用事件驱动记录,仅记录事务开始和结束时间戳,通过日志分析或消息队列(如Kafka)


深入理解 3D 火焰着色器:从 Shadertoy 到 Three.js 的完整实现解析
excel2025/10/4

本文由 AI 生成,结合 GLSL 原理与 Three.js 实践,旨在帮助初学者逐行理解代码,而不是仅仅“照抄能跑”。我会用直观类比、数值例子、代码注释来拆解整个火焰效果。 示例地址 一、前言:从 Shadertoy 到 Three.js Shadertoy 上有很多绚丽的着色器,但它们常常让新手望而生畏:几十行数学公式,cos/sin 嵌套,光线行进(raymarching)循环一堆看不懂的变量。 其实这些代码是有逻辑脉络的: 定义相机 → 每个像素对应一条射线 沿射线逐步前进(ray


Vue3和element plus在el-table中使用el-tree-select遇到的change事件坑
fxshy2025/10/3

1. 在el-tree-select中change事件使用 如果直接传递row, 拿到的不是最新的row的数据, 使用$index结合tableData来拿row <el-table-column prop="directory" label="所属目录树"> <template #default="scope"> <el-tree-select v-model="scope.row.areaTreeNodeId" :data="dir


贪心算法 | 每周8题(一)
小邓儿◑.◑2025/10/2

目录 0.0引言 1.0贪心算法介绍 1.1什么是贪心算法 2.0例题详解(来源力扣) 2.1 柠檬水找零 2.2将数组和减半的最少操作次数 2.3 最大数 2.4 K 次取反后最大化的数组和 2.5最长递增子序列 2.6摆动序列 2.7递增的三元子序列 2.8最长连续递增序列 3.0小结 0.0引言 从本周起,小编儿将带大家一起进入算法(^▽^)的学习当中。废话不多说,咱们从贪心走起儿😄😄😄 1.0贪心算法介绍 1.1什么是贪心算法 贪心算法(


风力发电机输出功率模型综述
less is more_09302025/10/2

摘要:在设计最优系统时,准确的建模是十分重要的。影响风机性能的主要因素是风速分布、轮毂高度以及所选风力机的功率输出曲线,故在进行风机建模时必须适当考虑这些因素。本文对风机输出功率建模的各种方法进行了详细的介绍。基于风能基本方程的建模方法使用时较繁琐,而且无法正确地复现实际风机的特性。基于假定功率曲线的建模方法虽然使用较为简单,但也缺乏准确性,不过当年平均风速较高时,表现出较为满意的响应。采用风机实际功率曲线建立特征方程的建模方法,当风机功率曲线光滑时,最小二乘法和三次样条插值法均能得到准确的结果


分布式光纤声波振动与AI的深度融合:开启智慧感知新时代
无锡布里渊10/2/2025

未来,随着AI算法的持续创新、算力的提升以及多源数据融合技术的发展,分布式光纤传感与AI的结合必将在更广阔的领域绽放异彩,为构建更安全、高效、智能的未来社会贡献核心力量。人工智能(AI),特别是机器学习与深度学习算法的迅猛发展,为解决这些难题提供了强大的工具,二者的深度融合正催生着智慧感知的新范式,前景广阔,优势显著。AI通过对大量标注数据的学习,能够精准识别不同物理事件(如不同类型的入侵行为、设备异常振动、管道泄漏等)的细微模式差异,大幅提高事件分类和识别的准确率,降低误报率和漏报率。

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0