Redis——Lettuce基本使用

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

Lettuce比Jedis好的点之一就是有官网:Lettuce

Lettuce的使用由4块组成:

  1. URI:定义连接信息;
  2. Client:redis客户端,集群使用专用的RedisClusterClient;
  3. Connection:redis连接,有多种类型(单机,哨兵,集群,订阅发布);
  4. Command:用户操作api,基本包含了redis全部命令;

使用流程也很简单:使用指定的URI创建Client,使用Client创建Connection,使用Connection创建Command,然后就可以操作Command的api了,最后关闭连接关闭客户端;

Command有三种类型:

  1. sync:同步,跟jedis差不多
  2. async:异步
  3. reactive:响应式

RedisURI的创建有3种方式:

  1. 使用字符串:RedisURI.create("redis://localhost/");
  2. 使用builder:RedisURI.Builder.redis("localhost", 6379).auth("password").database(1).build();
  3. 使用new对象:new RedisURI("localhost", 6379, 60, TimeUnit.SECONDS);

另外,使用字符串的时候几种不同的语法:

  • 单机:redis://[[username:]password@]host:port][/database][?[timeout=timeout[d|h|m|s|ms|us|ns]]
  • 单机(ssl):rediss://[[username:]password@]host:port][/database][?[timeout=timeout[d|h|m|s|ms|us|ns]]
  • 单机(Unix Domain Sockets):redis-socket://[[username:]password@]path[?[timeout=timeout[d|h|m|s|ms|us|ns]][&database=database]]
  • 哨兵:redis-sentinel://[[username:]password@]host1[:port1][,host2[:port2]],hostN[:portN]][/database][?[timeout=timeout[d|h|m|s|ms|us|ns]][&sentinelMasterId=sentinelMasterId]

超时时间单位:

  • d 天
  • h 小时
  • m 分钟
  • s 秒
  • ms 毫秒
  • us 微秒
  • ns 纳秒

简单Demo:(使用的redis版本为6.2.6,Lettuce为6.1.8)

maven导入

  1. <dependency>
  2. <groupId>io.lettuce</groupId>
  3. <artifactId>lettuce-core</artifactId>
  4. <version>6.1.8.RELEASE</version>
  5. </dependency>

测试代码

  1. /**
  2. * 2022年4月25日上午11:10:59
  3. */
  4. package testlettuce;
  5. import java.time.Duration;
  6. import java.util.concurrent.ExecutionException;
  7. import java.util.concurrent.TimeUnit;
  8. import java.util.concurrent.TimeoutException;
  9. import io.lettuce.core.ClientOptions;
  10. import io.lettuce.core.RedisClient;
  11. import io.lettuce.core.RedisFuture;
  12. import io.lettuce.core.RedisURI;
  13. import io.lettuce.core.TimeoutOptions;
  14. import io.lettuce.core.api.StatefulRedisConnection;
  15. import io.lettuce.core.api.async.RedisAsyncCommands;
  16. import io.lettuce.core.api.push.PushListener;
  17. import io.lettuce.core.api.push.PushMessage;
  18. import io.lettuce.core.api.reactive.RedisReactiveCommands;
  19. import io.lettuce.core.api.sync.RedisCommands;
  20. import io.lettuce.core.pubsub.RedisPubSubListener;
  21. import io.lettuce.core.pubsub.StatefulRedisPubSubConnection;
  22. import io.lettuce.core.pubsub.api.async.RedisPubSubAsyncCommands;
  23. import io.lettuce.core.pubsub.api.sync.RedisPubSubCommands;
  24. import io.lettuce.core.resource.ClientResources;
  25. import io.lettuce.core.resource.DefaultClientResources;
  26. import io.lettuce.core.resource.Delay;
  27. import reactor.core.publisher.Flux;
  28. import reactor.core.publisher.Mono;
  29. /**
  30. * @author XWF
  31. *
  32. */
  33. public class TestLettuce {
  34. /**
  35. * @param args
  36. */
  37. public static void main(String[] args) {
  38. // RedisURI uri = RedisURI.create("redis://default:123456@192.168.1.31:6379/0?timeout=5s");
  39. // RedisURI uri = new RedisURI("192.168.1.31", 6379, Duration.ofSeconds(5));
  40. // uri.setPassword("123456".toCharArray());
  41. RedisURI uri = RedisURI.builder()
  42. .withHost("192.168.1.31")
  43. .withPort(6379)
  44. .withAuthentication("default", "123456")
  45. .build();
  46. ClientResources resources = DefaultClientResources.builder()
  47. .ioThreadPoolSize(4) //设置I/O线程池大小(默认cpu数)仅在没有提供eventLoopGroupProvider时有效
  48. .computationThreadPoolSize(4) //设置用于计算的任务线程数(默认cpu数)仅在没有提供eventExecutorGroup时有效
  49. // .reconnectDelay(Delay.constant(Duration.ofSeconds(10))) //设置无状态尝试重连延迟,默认延迟上限30s
  50. .build();
  51. RedisClient client = RedisClient.create(resources, uri);
  52. ClientOptions options = ClientOptions.builder()
  53. .autoReconnect(true) //设置自动重连
  54. .pingBeforeActivateConnection(true) //激活连接前执行PING命令
  55. // .timeoutOptions(TimeoutOptions.enabled(Duration.ofSeconds(5))) //命令超时
  56. .build();
  57. client.setOptions(options);
  58. client.setDefaultTimeout(Duration.ofSeconds(3)); //为客户端创建的连接设置默认超时时间,适用于尝试连接和非阻塞命令
  59. StatefulRedisConnection<String, String> conn = client.connect();
  60. System.out.println("==sync==");
  61. RedisCommands<String, String> syncCmd = conn.sync();
  62. System.out.println(syncCmd.set("a", "aaaa"));
  63. String geta = syncCmd.get("a");
  64. System.out.println(geta);
  65. System.out.println("==async==");
  66. RedisAsyncCommands<String, String> asyncCmd = conn.async();
  67. RedisFuture<String> setb = asyncCmd.set("b", "bbbb");
  68. try {
  69. System.out.println(setb.get(1, TimeUnit.SECONDS));
  70. } catch (InterruptedException | ExecutionException | TimeoutException e1) {
  71. e1.printStackTrace();
  72. }
  73. RedisFuture<String> getb = asyncCmd.get("b");
  74. // a2.thenAccept(x -> {
  75. // System.out.println(x + x.length());
  76. // });
  77. getb.whenCompleteAsync((x, t) -> {
  78. System.out.println(x + t);
  79. });
  80. System.out.println("==reactive==");
  81. RedisReactiveCommands<String, String> reactiveCmd = conn.reactive();
  82. Mono<String> setc = reactiveCmd.set("c", "cccc");
  83. System.out.println(setc.block());
  84. Mono<String> getc = reactiveCmd.get("c");
  85. getc.subscribe(System.out::println);
  86. Flux<String> keys = reactiveCmd.keys("*");
  87. keys.subscribe(System.out::println);
  88. try {Thread.sleep(500);} catch (InterruptedException e) {}
  89. System.out.println("==pubsub==");
  90. StatefulRedisPubSubConnection<String, String> pubsubConn = client.connectPubSub();
  91. pubsubConn.addListener(new RedisPubSubListener<String, String>() {
  92. @Override
  93. public void unsubscribed(String channel, long count) {
  94. System.out.println("[unsubscribed]" + channel);
  95. }
  96. @Override
  97. public void subscribed(String channel, long count) {
  98. System.out.println("[subscribed]" + channel);
  99. }
  100. @Override
  101. public void punsubscribed(String pattern, long count) {
  102. }
  103. @Override
  104. public void psubscribed(String pattern, long count) {
  105. }
  106. @Override
  107. public void message(String pattern, String channel, String message) {
  108. }
  109. @Override
  110. public void message(String channel, String message) {
  111. System.out.println("[message]" + channel + " -> " + message);
  112. }
  113. });
  114. RedisPubSubAsyncCommands<String, String> pubsubCmd = pubsubConn.async();
  115. pubsubCmd.subscribe("CH");
  116. pubsubCmd.subscribe("CH2");
  117. pubsubCmd.publish("CH", "helloworld");
  118. pubsubCmd.publish("CH2", "HELLOWORLD");
  119. pubsubCmd.unsubscribe("CH");
  120. pubsubCmd.unsubscribe("CH2");
  121. try {Thread.sleep(500);} catch (InterruptedException e) {}
  122. }
  123. }

运行结果

参考:Lettuce Reference Guide

相关文章

最新文章

更多