Redis——Lettuce的主从哨兵模式

x33g5p2x  于2022-05-05 转载在 Redis  
字(4.2k)|赞(0)|评价(0)|浏览(946)

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;

  1. /**
  2. * 2022年4月29日下午2:46:43
  3. */
  4. package testlettuce;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.stream.Stream;
  8. import io.lettuce.core.ClientOptions;
  9. import io.lettuce.core.ReadFrom;
  10. import io.lettuce.core.RedisClient;
  11. import io.lettuce.core.RedisURI;
  12. import io.lettuce.core.api.sync.RedisCommands;
  13. import io.lettuce.core.codec.StringCodec;
  14. import io.lettuce.core.masterreplica.MasterReplica;
  15. import io.lettuce.core.masterreplica.StatefulRedisMasterReplicaConnection;
  16. import io.lettuce.core.pubsub.RedisPubSubListener;
  17. import io.lettuce.core.pubsub.StatefulRedisPubSubConnection;
  18. import io.lettuce.core.pubsub.api.sync.RedisPubSubCommands;
  19. import io.lettuce.core.sentinel.api.StatefulRedisSentinelConnection;
  20. import io.lettuce.core.sentinel.api.sync.RedisSentinelCommands;
  21. /**
  22. * @author XWF
  23. *
  24. */
  25. public class TestLettuceMasterReplicaAndSentinel {
  26. /**
  27. * @param args
  28. */
  29. public static void main(String[] args) {
  30. //sentinel
  31. RedisURI sentinelUri = RedisURI.builder()
  32. .withSentinel("192.168.1.31", 26379, "111111") //哨兵地址和密码
  33. .withSentinelMasterId("mymaster")
  34. .withPassword("123456".toCharArray())
  35. .build();
  36. RedisClient sentinelClient = RedisClient.create(sentinelUri);
  37. StatefulRedisSentinelConnection<String, String> sentinelConn = sentinelClient.connectSentinel();
  38. RedisSentinelCommands<String, String> sentinelCmd = sentinelConn.sync();
  39. System.out.println(sentinelCmd.info("sentinel"));
  40. List<Map<String, String>> masters = sentinelCmd.masters();
  41. System.out.println(masters);
  42. Map<String, String> mymaster = sentinelCmd.master("mymaster");
  43. System.out.println(mymaster.get("name") + "," + mymaster.get("ip") + "," + mymaster.get("port"));
  44. List<Map<String, String>> slaves = sentinelCmd.slaves("mymaster");
  45. slaves.forEach(x -> {
  46. System.out.println(x.get("ip") + ":" + x.get("port"));
  47. });
  48. StatefulRedisPubSubConnection<String, String> sentinelPubSubConn = sentinelClient.connectPubSub();//需要设置主从密码
  49. sentinelPubSubConn.addListener(new RedisPubSubListener<String, String>() {
  50. @Override
  51. public void unsubscribed(String channel, long count) {
  52. System.out.println(String.format("unsubscribed:%s", channel));
  53. }
  54. @Override
  55. public void subscribed(String channel, long count) {
  56. System.out.println(String.format("subscribed:%s", channel));
  57. }
  58. @Override
  59. public void punsubscribed(String pattern, long count) {
  60. }
  61. @Override
  62. public void psubscribed(String pattern, long count) {
  63. }
  64. @Override
  65. public void message(String pattern, String channel, String message) {
  66. }
  67. @Override
  68. public void message(String channel, String message) {
  69. System.out.println(String.format("message:%s -> %s", channel, message));
  70. }
  71. });
  72. RedisPubSubCommands<String, String> sentinelPubSubCmd = sentinelPubSubConn.sync();
  73. sentinelPubSubCmd.subscribe("__sentinel__:hello");
  74. try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}
  75. sentinelPubSubCmd.unsubscribe("__sentinel__:hello");
  76. //MasterReplica
  77. RedisClient client = RedisClient.create();
  78. ClientOptions options = ClientOptions.builder()
  79. .autoReconnect(true) //是否自动重连
  80. .pingBeforeActivateConnection(true) //连接激活之前是否执行PING命令
  81. .build();
  82. client.setOptions(options);
  83. StatefulRedisMasterReplicaConnection<String, String> conn = MasterReplica.connect(client, StringCodec.UTF8, sentinelUri);
  84. conn.setReadFrom(ReadFrom.ANY); //设置可从任何一个服务读数据
  85. for (int i = 0; i < 5; i++) {
  86. try {
  87. RedisCommands<String, String> cmd = conn.sync();
  88. cmd.set("aa", String.valueOf(i));
  89. System.out.print(cmd.get("aa") + "--");
  90. Stream.of(cmd.info("server").split("\n")).filter(x -> x.startsWith("tcp_port")).forEach(System.out::print);
  91. } catch (Exception e) {
  92. System.err.println(e);
  93. }
  94. }
  95. }
  96. }

运行结果:

相关文章

最新文章

更多