java应用实现redis高可用需客户端、哨兵、redis实例协同:一、redis侧配置主从与至少3个哨兵;二、java用lettuce/jedis通过哨兵自动发现主节点;三、应用控制读写分离与故障降级;四、验证切换及可观测性。

Java 应用要实现基于 Redis 主从复制 + 哨兵模式的高可用缓存架构,核心是让客户端自动感知主节点变化、读写分离可控、故障时无缝切换。这不是单纯改几行配置的事,而是客户端、哨兵集群、Redis 实例三者协同的结果。
一、Redis 侧:搭建主从+哨兵基础环境
先确保后端 Redis 已部署好一主多从,并启动至少 3 个哨兵实例(保障多数派决策):
- 主节点(如
192.168.1.10:6379)开启默认配置,无需特殊设置 - 每个从节点的
redis.conf中明确配置:replicaof 192.168.1.10 6379masterauth your_passwordreplica-read-only yes - 每个哨兵的
sentinel.conf中声明监控目标:sentinel monitor mymaster 192.168.1.10 6379 2sentinel auth-pass mymaster your_passwordsentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 10000 - 启动哨兵:
redis-sentinel /path/to/sentinel.conf
二、Java 客户端:用 Jedis 或 Lettuce 连接哨兵集群
不能直连主节点 IP,必须通过哨兵发现当前主节点地址。推荐使用 Lettuce(线程安全、响应式支持好),Jedis 需配合 JedisSentinelPool。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
Lettuce 示例(推荐):
创建RedisURI列表指向所有哨兵地址,再构建RedisClient和StatefulRedisMasterSlaveConnection:RedisURI sentinelUri = RedisURI.Builder.sentinel("192.168.1.11", 26379, "mymaster").withPassword("your_password").build();RedisClient client = RedisClient.create(sentinelUri);StatefulRedisMasterSlaveConnection<string string> connection = MasterSlave.connect(client, new Utf8StringCodec(), sentinelUri);</string>
它会自动订阅哨兵事件,主节点变更时重连新主库 -
Jedis 示例(需池化):
Set<string> sentinels = new HashSet();</string>sentinels.add("192.168.1.11:26379");sentinels.add("192.168.1.12:26379");JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels, new JedisPoolConfig(), 2000, "your_password");
每次pool.getResource()获取的连接,都来自当前哨兵认定的主节点
三、读写分离与故障应对策略
哨兵只解决“谁是主”的问题,读写逻辑仍由应用控制。建议分层设计:
-
写操作:始终走主连接(Lettuce 的
connection.sync()或 Jedis 的pool.getResource()) -
读操作:可选主或从——若允许短暂延迟,用
connection.readFrom(ReadFrom.SLAVE_PREFERRED)(Lettuce);Jedis 不原生支持从节点读,需自行封装或用connection.getReadConnection()扩展 -
故障期间降级:监听
SentinelEvent(Lettuce)或捕获JedisConnectionException,触发本地缓存兜底或返回默认值,避免雪崩 -
密码与 TLS 注意项:若 Redis 启用了 ACL 或 SSL,Lettuce 需设置
RedisURI.Builder.withSsl().withAuthentication();Jedis 需用JedisShardInfo封装认证信息
四、验证与可观测性要点
上线前务必验证自动切换是否生效:
- 手动 kill 主节点进程,观察哨兵日志是否输出
+sdown master→+odown master→+switch-master - Java 应用日志中应出现
Topology refreshed(Lettuce)或连接池重建提示(Jedis) - 调用
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster确认新主地址已更新 - 在代码中定期调用
client.getPartitions()(Lettuce)或pool.getCurrentHostMaster()(Jedis)做健康检查
这套组合不依赖额外中间件,落地成本低,适用于中小规模系统。只要哨兵集群稳定、客户端配置正确,主节点宕机后通常 5–10 秒内即可恢复写服务,读服务基本无感。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










