redis实战第十三篇 jedis连接redis cluster

时间:2022-07-23
本文章向大家介绍redis实战第十三篇 jedis连接redis cluster,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

redis cluster客户端有两种; Dummy:又称为傀儡客户端,redis的重定向机制会返回当前键所在的槽和对应的节点,dummy客户端根据这一机制随机连接任一redis获取键所在的节点,这种客户端实现代码简单,每次只需要根据重定向的信息再次发送请求即可,但是这样弊端也和明显,根据重定向再次发送请求额外增加了开销。 smart:它会在内部维护一个slot→node的映射关系,本地就可以实现键到节点的查找,从而保证IO效率的莪最大化。 jedisCluster就是一种smart客户端,它的构造方法如下:

public JedisCluster(Set<HostAndPort> jedisClusterNode, int connectionTimeout, int soTimeout,
                    int maxAttempts, String password, final GenericObjectPoolConfig poolConfig) {
    super(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, password, poolConfig);
}

参数说明: Set jedisClusterNode:所有redis cluster节点信息,也可以只填写部分,应为客户端可以通过cluster slots发现 int connectionTimeout:连接超时 soTimeout:读写超时 maxAttempts:重试次数,JedisCluster在连接的时候,如果出现连接错误,则会尝试随机连接一个节点,如果当期尝试的节点返回Moved重定向,jedis cluster会重新更新clots缓存。如果重试依然返回连接错误,会接着再次重试,当重试次数大于maxAttempts会报出Jedis ClusterMaxRedirectionsException(“to many Cluster redireciotns?”)异常 password:集群密码 poolConfig:连接池参数

JedisCluster有以下特点、 1)它会为所有节点都维护一个连接池JedisPool,建议JedisCluster使用单例 2)JedisCluster每次操作完不需要管理连接池的借还,它在内部已经完成 3)JedisCluster一般不需要执行close操作,它会将所有的JedisPool执行destroy操作

pom依赖

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>3.0.0</version>
		</dependency>

JedisCluster实例

package com.gildata.duplicateandtagtest.redis;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by LiChao on 2019/2/16
 */
public class RedisClusterUtil {

    private static JedisCluster jedis = null;

    //可用连接实例的最大数目,默认为8;
    //如果赋值为-1,则表示不限制,如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
    private static Integer MAX_TOTAL = 1024;
    //控制一个pool最多有多少个状态为idle(空闲)的jedis实例,默认值是8
    private static Integer MAX_IDLE = 200;
    //等待可用连接的最大时间,单位是毫秒,默认值为-1,表示永不超时。
    //如果超过等待时间,则直接抛出JedisConnectionException
    private static Integer MAX_WAIT_MILLIS = 10000;
    //在borrow(用)一个jedis实例时,是否提前进行validate(验证)操作;
    //如果为true,则得到的jedis实例均是可用的
    private static Boolean TEST_ON_BORROW = true;
    //在空闲时检查有效性, 默认false
    private static Boolean TEST_WHILE_IDLE = true;
    //是否进行有效性检查
    private static Boolean TEST_ON_RETURN = true;

    //访问密码
    private static String AUTH = "1234@abcd";

    /**
     * 静态块,初始化Redis连接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
        /*注意:
            在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了
            这是因为高版本中官方废弃了此方法,用以下两个属性替换。
            maxActive  ==>  maxTotal
            maxWait==>  maxWaitMillis
         */
            config.setMaxTotal(MAX_TOTAL);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT_MILLIS);
            config.setTestOnBorrow(TEST_ON_BORROW);
            config.setTestWhileIdle(TEST_WHILE_IDLE);
            config.setTestOnReturn(TEST_ON_RETURN);

            Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
            jedisClusterNode.add(new HostAndPort("192.168.0.31", 6380));
            jedisClusterNode.add(new HostAndPort("192.168.0.32", 6380));
            jedisClusterNode.add(new HostAndPort("192.168.0.33", 6380));
            jedisClusterNode.add(new HostAndPort("192.168.0.34", 6380));
            jedisClusterNode.add(new HostAndPort("192.168.0.35", 6380));
            jedisClusterNode.add(new HostAndPort("192.168.0.36", 6380));

            jedis = new JedisCluster(jedisClusterNode,1000,1000,5,AUTH,config);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    public static JedisCluster getJedis(){
        return jedis;
    }
}

测试

@Test
public void testCluster(){
    JedisCluster jedis = RedisClusterUtil.getJedis();
    jedis.set("cluster","hello world");
    System.out.println(jedis.get("cluster"));
}