-1- 说明
redis版本:redis-3.2.6
环境: 集群, 三主三备
lettuce 版本4.3.0-final/ 4.2.0-final
这两个版本相差比较大,使用中可能会版本不一致的问题,主要和netty的版本有关
-2- maven 依赖
- <!-- Lettuce Redis客户端 -->
- <dependency>
- <groupId>biz.paluch.redis</groupId>
- <artifactId>lettuce</artifactId>
- <!--<version>4.2.0.Final</version>-->
- <version>4.3.0.Final</version>
- </dependency>
-2- Lettuce 单机客户端
- import java.util.concurrent.ExecutionException;
- import com.lambdaworks.redis.RedisClient;
- import com.lambdaworks.redis.RedisFuture;
- import com.lambdaworks.redis.RedisURI;
- import com.lambdaworks.redis.api.StatefulRedisConnection;
- import com.lambdaworks.redis.api.async.RedisAsyncCommands;
- import com.lambdaworks.redis.api.sync.RedisCommands;
- public class LettuceClient {
- public static void main(String[] args) {
- RedisClient client = RedisClient.create(RedisURI.create("redis://192.168.37.128:7000"));
- StatefulRedisConnection<String, String> connect = client.connect();
- /* 同步执行的命令 */
- RedisCommands<String, String> commands = connect.sync();
- String str = commands.get("test1");
- //String str2 = commands.get("test2");//MOVED 8899 192.168.37.128:7001;;;;client是单机版
- System.out.println(str);
- /* 异步执行的命令 */
- // RedisAsyncCommands<String, String> commands = connect.async();
- // RedisFuture<String> future = commands.get("test1");
- // try {
- // String str = future.get();
- // System.out.println(str);
- // } catch (InterruptedException e) {
- // e.printStackTrace();
- // } catch (ExecutionException e) {
- // e.printStackTrace();
- // }
- connect.close();
- client.shutdown();
- }
- }
单机客户端连接集群环境Redis,如果key对应的哈希槽不在当前client创建的主机上,会报MOVE....192.168.37.128:7001 异常
使用Lettuce 操作Redis3.2.6集群
Lettuce使用Netty作为底层通信框架
Java代码
- import java.util.ArrayList;
- import java.util.concurrent.ExecutionException;
- import com.lambdaworks.redis.RedisFuture;
- import com.lambdaworks.redis.RedisURI;
- import com.lambdaworks.redis.cluster.RedisClusterClient;
- import com.lambdaworks.redis.cluster.api.StatefulRedisClusterConnection;
- import com.lambdaworks.redis.cluster.api.async.RedisAdvancedClusterAsyncCommands;
- import com.lambdaworks.redis.cluster.api.sync.RedisAdvancedClusterCommands;
- public class LettuceClusterClient {
- public static void main(String[] args) {
- ArrayList<RedisURI> list = new ArrayList<>();
- list.add(RedisURI.create("redis://192.168.37.128:7000"));
- list.add(RedisURI.create("redis://192.168.37.128:7001"));
- list.add(RedisURI.create("redis://192.168.37.128:7002"));
- list.add(RedisURI.create("redis://192.168.37.128:7003"));
- list.add(RedisURI.create("redis://192.168.37.128:7004"));
- list.add(RedisURI.create("redis://192.168.37.128:7005"));
- RedisClusterClient client = RedisClusterClient.create(list);
- //RedisClusterClient client = RedisClusterClient.create("redis://192.168.37.128:7000");
- StatefulRedisClusterConnection<String, String> connect = client.connect();
- /* 同步执行的命令 */
- RedisAdvancedClusterCommands<String, String> commands = connect.sync();
- String str = commands.get("test2");
- System.out.println(str);
- /* 异步执行的命令 */
- // RedisAdvancedClusterAsyncCommands<String, String> commands= connect.async();
- // RedisFuture<String> future = commands.get("test2");
- // try {
- // String str = future.get();
- // System.out.println(str);
- // } catch (InterruptedException e) {
- // e.printStackTrace();
- // } catch (ExecutionException e) {
- // e.printStackTrace();
- // }
- connect.close();
- client.shutdown();
- }
- }
相同的代码,使用不同的Lettuce版本执行,可能会报异常,主要是引入的Netty版本有关,只需把Netty的版本修改成相同的即可
Xml代码
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-all</artifactId>
- <!-- <version>4.0.14.Final</version> -->
- <!-- <version>4.1.6.Final</version> --><!-- lettuce 4.3 -->
- <version>4.0.36.Final</version><!-- lettuce 4.2 -->
- </dependency>
Lettuce4.2 连接池 操作Redis3.2.6
4.2连接池貌似只能连接单机Redis??????!(RedisClusterClient没有pool()方法! 如果有知道集群连接池怎么使用的请告诉我,谢谢 )顾当连接redis集群时可能出现MOVE...异常
此连接池在lettuce4.3中已经弃用了.
- import java.util.concurrent.TimeUnit;
- import com.lambdaworks.redis.RedisClient;
- import com.lambdaworks.redis.RedisConnectionPool;
- import com.lambdaworks.redis.RedisFuture;
- import com.lambdaworks.redis.RedisURI;
- import com.lambdaworks.redis.api.async.RedisAsyncCommands;
- /**
- * lettuce4.2连接池, 4.3已经废弃了 仅能连接单台redis?! 如果是Redis集群,可能因为哈希槽报错:MOVE.....
- */
- public class Lettuce_4_2_Pool {
- private static final RedisConnectionPool<RedisAsyncCommands<String, String>> pool;
- private static final String REDIS_HOST = "192.168.37.128";
- private static final int REDIS_PORT = 7000;
- private static final int REDIS_EXPIRE = 1;
- private static final int REDIS_MAX_IDLE = 10;
- private static final int REDIS_MAX_ACTIVE = 10;
- static {
- RedisURI redisURI = new RedisURI();
- redisURI.setHost(REDIS_HOST);
- redisURI.setPort(REDIS_PORT);
- // redisURI.setPassword("");
- redisURI.setTimeout(REDIS_EXPIRE);
- redisURI.setUnit(TimeUnit.SECONDS);
- // 也可直接将url的字符串传入 RedisClient.create()方法中
- // eg:redis://[password@]host[:port][/databaseNumber]
- RedisClient client = RedisClient.create(redisURI); //
- // 从redis客户端中获取一个异步的redis缓冲池
- pool = client.asyncPool(REDIS_MAX_IDLE, REDIS_MAX_ACTIVE);
- // 参数说明:REDIS_MAX_IDLE 为本缓冲池中最大闲置连接数量 // REDIS_MAX_ACTIVE为本缓冲池中最大活动连接数量
- }
- // 从缓冲池中获取一个连接
- public static RedisAsyncCommands<String, String> getRedisConnection() {
- return pool.allocateConnection();
- }
- // 关闭服务器时 关闭缓冲池
- public static void shutDown() {
- pool.close();
- }
- public static void main(String[] args) {
- try (RedisAsyncCommands<String, String> commads = pool.allocateConnection()) {
- RedisFuture<String> future = commads.get("test2");
- String str = future.get();
- System.out.println(str);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }