Lettuce操作redis使用指南

      -1- 说明

            redis版本:redis-3.2.6

            环境: 集群, 三主三备

            lettuce 版本4.3.0-final/ 4.2.0-final

            这两个版本相差比较大,使用中可能会版本不一致的问题,主要和netty的版本有关

      -2- maven 依赖

            

Xml代码  

  1. <!-- Lettuce Redis客户端 -->  
  2. <dependency>  
  3.     <groupId>biz.paluch.redis</groupId>  
  4.     <artifactId>lettuce</artifactId>  
  5.     <!--<version>4.2.0.Final</version>-->  
  6.     <version>4.3.0.Final</version>  
  7. </dependency>  

 

 

      -2- Lettuce 单机客户端

           

Java代码  

  1. import java.util.concurrent.ExecutionException;  
  2.   
  3. import com.lambdaworks.redis.RedisClient;  
  4. import com.lambdaworks.redis.RedisFuture;  
  5. import com.lambdaworks.redis.RedisURI;  
  6. import com.lambdaworks.redis.api.StatefulRedisConnection;  
  7. import com.lambdaworks.redis.api.async.RedisAsyncCommands;  
  8. import com.lambdaworks.redis.api.sync.RedisCommands;  
  9.   
  10. public class LettuceClient {  
  11.   
  12.     public static void main(String[] args) {  
  13.         RedisClient client = RedisClient.create(RedisURI.create("redis://192.168.37.128:7000"));  
  14.         StatefulRedisConnection<String, String> connect = client.connect();  
  15.           
  16.         /* 同步执行的命令 */  
  17.         RedisCommands<String, String> commands = connect.sync();  
  18.         String str = commands.get("test1");  
  19.         //String str2 = commands.get("test2");//MOVED 8899 192.168.37.128:7001;;;;client是单机版  
  20.         System.out.println(str);  
  21.           
  22.         /*  异步执行的命令  */  
  23. //      RedisAsyncCommands<String, String> commands = connect.async();  
  24. //      RedisFuture<String> future = commands.get("test1");  
  25. //      try {  
  26. //          String str = future.get();  
  27. //          System.out.println(str);  
  28. //      } catch (InterruptedException e) {  
  29. //          e.printStackTrace();  
  30. //      } catch (ExecutionException e) {  
  31. //          e.printStackTrace();  
  32. //      }  
  33.           
  34.         connect.close();  
  35.         client.shutdown();  
  36.     }  
  37. }  

 单机客户端连接集群环境Redis,如果key对应的哈希槽不在当前client创建的主机上,会报MOVE....192.168.37.128:7001 异常

 

使用Lettuce 操作Redis3.2.6集群

Lettuce使用Netty作为底层通信框架

 

Java代码  

  1. import java.util.ArrayList;  
  2. import java.util.concurrent.ExecutionException;  
  3.   
  4. import com.lambdaworks.redis.RedisFuture;  
  5. import com.lambdaworks.redis.RedisURI;  
  6. import com.lambdaworks.redis.cluster.RedisClusterClient;  
  7. import com.lambdaworks.redis.cluster.api.StatefulRedisClusterConnection;  
  8. import com.lambdaworks.redis.cluster.api.async.RedisAdvancedClusterAsyncCommands;  
  9. import com.lambdaworks.redis.cluster.api.sync.RedisAdvancedClusterCommands;  
  10.   
  11. public class LettuceClusterClient {  
  12.   
  13.     public static void main(String[] args) {  
  14.         ArrayList<RedisURI> list = new ArrayList<>();  
  15.         list.add(RedisURI.create("redis://192.168.37.128:7000"));  
  16.         list.add(RedisURI.create("redis://192.168.37.128:7001"));  
  17.         list.add(RedisURI.create("redis://192.168.37.128:7002"));  
  18.         list.add(RedisURI.create("redis://192.168.37.128:7003"));  
  19.         list.add(RedisURI.create("redis://192.168.37.128:7004"));  
  20.         list.add(RedisURI.create("redis://192.168.37.128:7005"));  
  21.         RedisClusterClient client = RedisClusterClient.create(list);  
  22.         //RedisClusterClient client = RedisClusterClient.create("redis://192.168.37.128:7000");  
  23.         StatefulRedisClusterConnection<String, String> connect = client.connect();  
  24.           
  25.         /* 同步执行的命令 */  
  26.         RedisAdvancedClusterCommands<String, String> commands = connect.sync();  
  27.         String str = commands.get("test2");  
  28.         System.out.println(str);  
  29.           
  30.         /*  异步执行的命令  */  
  31. //      RedisAdvancedClusterAsyncCommands<String, String> commands= connect.async();  
  32. //      RedisFuture<String> future = commands.get("test2");  
  33. //      try {  
  34. //          String str = future.get();  
  35. //          System.out.println(str);  
  36. //      } catch (InterruptedException e) {  
  37. //          e.printStackTrace();  
  38. //      } catch (ExecutionException e) {  
  39. //          e.printStackTrace();  
  40. //      }  
  41.           
  42.         connect.close();  
  43.         client.shutdown();  
  44.     }  
  45. }  

    相同的代码,使用不同的Lettuce版本执行,可能会报异常,主要是引入的Netty版本有关,只需把Netty的版本修改成相同的即可 

Xml代码  

  1. <dependency>  
  2.     <groupId>io.netty</groupId>  
  3.     <artifactId>netty-all</artifactId>  
  4.         <!-- <version>4.0.14.Final</version> -->  
  5.     <!-- <version>4.1.6.Final</version> --><!-- lettuce 4.3 -->  
  6.     <version>4.0.36.Final</version><!-- lettuce 4.2 -->  
  7. </dependency>  

 

 

Lettuce4.2 连接池 操作Redis3.2.6

4.2连接池貌似只能连接单机Redis??????!(RedisClusterClient没有pool()方法! 如果有知道集群连接池怎么使用的请告诉我,谢谢 )顾当连接redis集群时可能出现MOVE...异常

此连接池在lettuce4.3中已经弃用了.

 

 

Java代码  

  1. import java.util.concurrent.TimeUnit;  
  2. import com.lambdaworks.redis.RedisClient;  
  3. import com.lambdaworks.redis.RedisConnectionPool;  
  4. import com.lambdaworks.redis.RedisFuture;  
  5. import com.lambdaworks.redis.RedisURI;  
  6. import com.lambdaworks.redis.api.async.RedisAsyncCommands;  
  7.   
  8. /** 
  9.  * lettuce4.2连接池, 4.3已经废弃了 仅能连接单台redis?! 如果是Redis集群,可能因为哈希槽报错:MOVE..... 
  10.  */  
  11. public class Lettuce_4_2_Pool {  
  12.   
  13.     private static final RedisConnectionPool<RedisAsyncCommands<String, String>> pool;  
  14.     private static final String REDIS_HOST = "192.168.37.128";  
  15.     private static final int REDIS_PORT = 7000;  
  16.     private static final int REDIS_EXPIRE = 1;  
  17.     private static final int REDIS_MAX_IDLE = 10;  
  18.     private static final int REDIS_MAX_ACTIVE = 10;  
  19.   
  20.     static {  
  21.         RedisURI redisURI = new RedisURI();  
  22.         redisURI.setHost(REDIS_HOST);  
  23.         redisURI.setPort(REDIS_PORT);  
  24.         // redisURI.setPassword("");  
  25.         redisURI.setTimeout(REDIS_EXPIRE);  
  26.         redisURI.setUnit(TimeUnit.SECONDS);  
  27.         // 也可直接将url的字符串传入 RedisClient.create()方法中  
  28.         // eg:redis://[password@]host[:port][/databaseNumber]  
  29.         RedisClient client = RedisClient.create(redisURI); //  
  30.         // 从redis客户端中获取一个异步的redis缓冲池  
  31.         pool = client.asyncPool(REDIS_MAX_IDLE, REDIS_MAX_ACTIVE);  
  32.         // 参数说明:REDIS_MAX_IDLE 为本缓冲池中最大闲置连接数量 // REDIS_MAX_ACTIVE为本缓冲池中最大活动连接数量  
  33.     }  
  34.   
  35.     // 从缓冲池中获取一个连接  
  36.     public static RedisAsyncCommands<String, String> getRedisConnection() {  
  37.         return pool.allocateConnection();  
  38.     }  
  39.   
  40.     // 关闭服务器时 关闭缓冲池  
  41.     public static void shutDown() {  
  42.         pool.close();  
  43.     }  
  44.       
  45.     public static void main(String[] args) {  
  46.   
  47.         try (RedisAsyncCommands<String, String> commads = pool.allocateConnection()) {  
  48.             RedisFuture<String> future = commads.get("test2");  
  49.             String str = future.get();  
  50.             System.out.println(str);  
  51.         } catch (Exception e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.     }  
  55.       
  56. }  

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值