Lettuce操作主从服务器使用的是MasterReplica.connect()方法创建的主从专用StatefulRedisMasterReplicaConnection,跟普通的通过client创建有点区别,Lettuce连接哨兵则使用client的connectSentinel()方法,创建的是哨兵专用的StatefulRedisSentinelConnection;

另外,主从模式可以设置ReadFrom读取数据来源:(还是挺方便的)

  • MASTER:只从主服务读取数据;
  • MASTER_PREFERRED:优先从主服务读取数据,主服务不可用时再从从服务读取;
  • UPSTREAM:同MASTER;
  • UPSTREAM_PREFERRED:同MASTER_PREFERRED;
  • REPLICA_PREFERRED:优先从从服务读取数据,没有可用从服务时再从主服务读取;
  • REPLICA:只从从服务读取数据;
  • LOWEST_LATENCY:使用延迟低的读取;
  • ANY:可从任何节点读取;
  • ANY_REPLICA:从任何从服务读取;

测试Demo:

使用的redis版本6.2.6,Lettuce版本6.1.8;

主从redis:192.168.1.31:6379、192.168.1.31:6380、192.168.1.31:6381;

哨兵:192.168.1.31:26379;

/*** 2022年4月29日下午2:46:43*/
package testlettuce;import java.util.List;
import java.util.Map;
import java.util.stream.Stream;import io.lettuce.core.ClientOptions;
import io.lettuce.core.ReadFrom;
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.api.sync.RedisCommands;
import io.lettuce.core.codec.StringCodec;
import io.lettuce.core.masterreplica.MasterReplica;
import io.lettuce.core.masterreplica.StatefulRedisMasterReplicaConnection;
import io.lettuce.core.pubsub.RedisPubSubListener;
import io.lettuce.core.pubsub.StatefulRedisPubSubConnection;
import io.lettuce.core.pubsub.api.sync.RedisPubSubCommands;
import io.lettuce.core.sentinel.api.StatefulRedisSentinelConnection;
import io.lettuce.core.sentinel.api.sync.RedisSentinelCommands;/*** @author XWF**/
public class TestLettuceMasterReplicaAndSentinel {/*** @param args*/public static void main(String[] args) {//sentinelRedisURI sentinelUri = RedisURI.builder().withSentinel("192.168.1.31", 26379, "111111") //哨兵地址和密码.withSentinelMasterId("mymaster").withPassword("123456".toCharArray()).build();RedisClient sentinelClient = RedisClient.create(sentinelUri);StatefulRedisSentinelConnection<String, String> sentinelConn = sentinelClient.connectSentinel();RedisSentinelCommands<String, String> sentinelCmd = sentinelConn.sync();System.out.println(sentinelCmd.info("sentinel"));List<Map<String, String>> masters = sentinelCmd.masters();System.out.println(masters);Map<String, String> mymaster = sentinelCmd.master("mymaster");System.out.println(mymaster.get("name") + "," + mymaster.get("ip") + "," + mymaster.get("port"));List<Map<String, String>> slaves = sentinelCmd.slaves("mymaster");slaves.forEach(x -> {System.out.println(x.get("ip") + ":" + x.get("port"));});StatefulRedisPubSubConnection<String, String> sentinelPubSubConn = sentinelClient.connectPubSub();//需要设置主从密码sentinelPubSubConn.addListener(new RedisPubSubListener<String, String>() {@Overridepublic void unsubscribed(String channel, long count) {System.out.println(String.format("unsubscribed:%s", channel));}@Overridepublic void subscribed(String channel, long count) {System.out.println(String.format("subscribed:%s", channel));}@Overridepublic void punsubscribed(String pattern, long count) {}@Overridepublic void psubscribed(String pattern, long count) {}@Overridepublic void message(String pattern, String channel, String message) {}@Overridepublic void message(String channel, String message) {System.out.println(String.format("message:%s -> %s", channel, message));}});RedisPubSubCommands<String, String> sentinelPubSubCmd = sentinelPubSubConn.sync();sentinelPubSubCmd.subscribe("__sentinel__:hello");try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}sentinelPubSubCmd.unsubscribe("__sentinel__:hello");//MasterReplicaRedisClient client = RedisClient.create();ClientOptions options = ClientOptions.builder().autoReconnect(true)  //是否自动重连.pingBeforeActivateConnection(true) //连接激活之前是否执行PING命令.build();client.setOptions(options);StatefulRedisMasterReplicaConnection<String, String> conn = MasterReplica.connect(client, StringCodec.UTF8, sentinelUri);conn.setReadFrom(ReadFrom.ANY);       //设置可从任何一个服务读数据for (int i = 0; i < 5; i++) {try {RedisCommands<String, String> cmd = conn.sync();cmd.set("aa", String.valueOf(i));System.out.print(cmd.get("aa") + "--");Stream.of(cmd.info("server").split("\n")).filter(x -> x.startsWith("tcp_port")).forEach(System.out::print);} catch (Exception e) {System.err.println(e);}}}}

运行结果:

Redis——Lettuce的主从哨兵模式相关推荐

  1. docker+网桥+redis主从+哨兵模式

    docker+网桥+redis主从+哨兵模式 我是在两台服务器上实验的,一台服务器的ip是192.168.213.144,另一台服务器的ip是192.168.213.145 1. 搭建网桥 关于第一部 ...

  2. Redis集群之哨兵模式

    本文来说下Redis集群之哨兵模式 文章目录 概述 哨兵模式 什么是哨兵 实现原理 哨兵选举过程 master选举过程 cluster集群模式 cluster集群模式是怎么存放数据的 键是如何和163 ...

  3. Redis高可用之哨兵模式

    我们前面学习了Redis的主从模式,可以实现读写分离和数据备份,减轻Redis中master节点的压力.但是主从模式仅仅是减轻了master节点的读压力和做数据备份,一旦master节点挂了之后,我们 ...

  4. dotNetCore操作Redis(含CentOS7哨兵模式部署)

    现在说到使用缓存中间件基本就是 Redis 了,通常开发环境或测试环境部署一个单机版就可以运行了,但要上生产环境还需要进行高可用的方式来部署,本文说说在 CentOS7 中 Redis 高可用的部署以 ...

  5. 为什么至少三个哨兵_入职第一周,组长让我把部门redis服务搞成哨兵模式...慌-龙跃十二...

    少点代码,多点头发 本文已经被GitHub收录,欢迎大家踊跃star 和 issues. 入职第一周,我被坑了 最近刚入职新公司,本来想着这刚来新公司,一般都是熟悉熟悉公司同事,看看组内工程文档,找几 ...

  6. Redis(主从复制、哨兵模式、集群)概述及部署

    Redis(主从复制.哨兵模式.集群)概述及部署 前言 一.主从复制 (1)主从复制原理 (2)主从复制作用 (3)主从复制流程 (4)搭建主从复制 ①修改master节点配置文件 ②修改Slave节 ...

  7. Redis(十八)——Sentinel 哨兵模式

    文章目录 Redis(十八)--Sentinel 哨兵模式 1.哨兵模式概述 2.搭建 Sentinel 集群 3.sentinel 集群测试 4.哨兵模式的所有配置详解 Redis(十八)--Sen ...

  8. Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统

    一.预约系统的性能瓶颈 1.预约系统应对热门爆品时的缺陷 用户进行预约会涉及到两个维度的数据变更一个是用户信息,一个是SKU信息,如图↓所示: 正常来说这么搞一点问题没有,即便涉及到写数据库,但是每个 ...

  9. redis 主从哨兵模式搭建

    一.REDIS主从模式,搭建三个节点,同一个机器,三个端口. 安装包 wget http://download.redis.io/releases/redis-5.0.7.tar.gz 安装步骤 ht ...

  10. redis 主从 + 哨兵模式集群部署(3台机器)

    前言 本文只讲如何部署,然后会贴出具体配置,以及如何验证是否部署成功(redis 版本采用 4.0.6 ).既不会介绍 redis 如何安装(本人采用源码安装方式),也不会涉及主从复制,哨兵模式具体原 ...

最新文章

  1. 启动R环境并执行R脚本
  2. 《人工智能标准化白皮书(2018版)》发布|附下载
  3. 配置linux下node节点的ip
  4. dim private public static_PHP中const,static,public,private,protected的区别
  5. 转:asp.net 负载平衡-Session相关
  6. Asp.net--DropDownList控件绑定数据库数据
  7. c语言Max错误,C语言编程常见错误.pdf
  8. python调用实例做父类_Python super() 调用父类方法, 但是父类中 self 并不是父类的实例而是子类的实例?...
  9. 南信大考研真题c语言_考研经验分享---南京信息工程大学计算机考研
  10. 使用MarkDown来写一份漂亮简约的简历
  11. tftp命令怎么传输文件,5步掌握tftp命令的使用方法
  12. linux 重启ftp的命令,linux开启ftp命令
  13. c语言windows文本框,windows编程 如何创建文本框?
  14. 工业级无线路由器无线客户端的配置教程
  15. Android 获取电池容量 mAh
  16. obj 与 fbx 三维模型文件对比
  17. 〖Python语法进阶篇⑯〗- 综合实战 - 抽奖系统之基础功能开发 - base奖品相关功能实现
  18. 在python语言中ipo模式不包括_下面不是IPO模式的一部分的是()_学小易找答案
  19. 英语专业 计算机语言学,SFU专业合集 | 语言学(Linguistic)专业一览
  20. .Net C# 发送带背景图html邮件(解决Outlook不显示背景图问题)

热门文章

  1. 上海驾驶证满6年换证
  2. U盘系统、格式化等问题的解决办法
  3. c语言的绝对值怎么表示,C语言中  绝对值  怎么表示?
  4. NUC980 NuWriter无法烧录固件
  5. CTFweb篇——html源代码签到题
  6. 数据库sql对象名无效问题
  7. Java项目-黄金矿工
  8. 哈希原理与常见哈希函数
  9. IDEA - 如何安装Statistic代码统计插件?
  10. ROS环境下使用WHEELTEC N100惯导模块