天天看點

Java redis線程池(哨兵模式和叢集模式)Java redis線程池(哨兵模式和叢集模式)

@羲凡——隻為了更好的活着

Java redis線程池(哨兵模式和叢集模式)

0.前提準備

pom.xml檔案中要添加依賴(根據自己的flink版本修改哈)

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

1.Redis 哨兵模式 操作工具類

package redis;

import java.util.HashSet;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

public class RedisSentinelUtil {
    private static final Logger LOG = LoggerFactory.getLogger(RedisSentinelUtil.class);
    // 最大連接配接執行個體的最大數目(預設值8)
    private static int MAX_TOTAL = -1;
    // 最多有多少個狀态為idle(空閑的)的jedis執行個體(預設值8)
    private static int MAX_IDLE = 300;
    // 連接配接的最大時間,機關毫秒
    private static int MAX_WAIT = 3 * 1000;
    private static int MIN_IDLE = 100;
    private static JedisSentinelPool redisSentinelJedisPool = null;

    // 擷取Jedis線程池
    public static synchronized void getPool(String clusterName, String addr, String auth) {
        if (redisSentinelJedisPool == null) {
            String[] hostAndPorts = addr.split(",");
            Set<String> sentinels = new HashSet<String>();
            for (String string : hostAndPorts) {
                sentinels.add(string);
            }
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_TOTAL); //最大連接配接數, 預設8
            config.setMaxIdle(MAX_IDLE); //最大空閑連接配接數, 預設8
            config.setMaxWaitMillis(MAX_WAIT); //擷取連接配接時的最大等待時間(毫秒)
            config.setMinIdle(MIN_IDLE); //最小空閑連接配接數, 預設0
            config.setTestOnBorrow(true); //在擷取連接配接時檢查有效性, 預設false
            config.setTestOnReturn(true); //在返還連接配接時檢查有效性, 預設false
            config.setTestWhileIdle(true);//在連結空閑時檢查有效性, 預設false
            config.setTimeBetweenEvictionRunsMillis(30000); //逐出掃描的時間間隔(毫秒)
            config.setNumTestsPerEvictionRun(10); //每次逐出檢查時最大逐出數目
            config.setMinEvictableIdleTimeMillis(60000); //逐出連接配接的最小空閑時間(毫秒)

            if (auth==null || "".equals(auth.trim())) {
                redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, config, auth);
            } else {
                redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, config);
            }
        }
    }

    // 擷取redis連接配接
    private static Jedis getJedis() {
        Jedis resource = null;
        int count = 0;
        while (resource == null && count < 20) {
            try {
                resource = redisSentinelJedisPool.getResource();
            } catch (Exception e) {
                count++;
                if (resource != null) {
                    resource.close();
                    resource = null;
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return resource;
    }

    // 從redis中擷取使用者資訊
    public static String getUserInfo(String name) {
        String userInfo = null;
        Jedis resource = getJedis();
        try {
            userInfo = resource.get(name);
        } catch (Exception e) {
            LOG.error("從Redis連接配接池中擷取連接配接異常!異常消息:", e);
        } finally {
            if (resource != null) {
                try {
                    resource.close();
                    resource = null;
                } catch (Exception e) {
                    LOG.warn("返還連接配接異常!異常消息:", e);
                }
            }
        }
        return userInfo;
    }
}
           

2.Redis 叢集模式 操作工具類

package redis;

import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import redis.clients.jedis.*;

public class RedisClusterUtil {
    private static final Logger LOG = LoggerFactory.getLogger(RedisSentinelUtil.class);
    // 最大連接配接執行個體的最大數目(預設值8)
    private static int MAX_TOTAL = -1;
    // 最多有多少個狀态為idle(空閑的)的jedis執行個體(預設值8)
    private static int MAX_IDLE = 300;
    // 連接配接的最大時間,機關毫秒
    private static int MAX_WAIT = 3 * 1000;
    private static int MIN_IDLE = 100;
    private static ShardedJedisPool shardedJedisPool = null ;
    //private static JedisSentinelPool redisSentinelJedisPool = null;

    // 擷取Jedis線程池
    public static synchronized void getPool(String addr) {
        if (shardedJedisPool == null) {
            String[] hostAndPorts = addr.split(",");
            List<JedisShardInfo> shardInfos = new ArrayList<JedisShardInfo>();
            for (String string : hostAndPorts) {
                shardInfos.add(new JedisShardInfo(string.split(":")[0],string.split(":")[1]));
            }
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_TOTAL); //最大連接配接數, 預設8
            config.setMaxIdle(MAX_IDLE); //最大空閑連接配接數, 預設8
            config.setMaxWaitMillis(MAX_WAIT); //擷取連接配接時的最大等待時間(毫秒)
            config.setMinIdle(MIN_IDLE); //最小空閑連接配接數, 預設0
            config.setTestOnBorrow(true); //在擷取連接配接時檢查有效性, 預設false
            config.setTestOnReturn(true); //在返還連接配接時檢查有效性, 預設false
            config.setTestWhileIdle(true);//在連結空閑時檢查有效性, 預設false
            config.setTimeBetweenEvictionRunsMillis(30000); //逐出掃描的時間間隔(毫秒)
            config.setNumTestsPerEvictionRun(10); //每次逐出檢查時最大逐出數目
            config.setMinEvictableIdleTimeMillis(60000); //逐出連接配接的最小空閑時間(毫秒)

            shardedJedisPool = new ShardedJedisPool(config, shardInfos);
        }
    }

    // 擷取redis連接配接
    private static ShardedJedis getJedis() {
        ShardedJedis resource = null;
        int count = 0;
        while (resource == null && count < 20) {
            try {
                resource = shardedJedisPool.getResource();
            } catch (Exception e) {
                count++;
                if (resource != null) {
                    resource.close();
                    resource = null;
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return resource;
    }

    // 從redis中擷取使用者資訊
    public static String getUserInfo(String name) {
        String userInfo = null;
        ShardedJedis resource = getJedis();
        try {
            userInfo = resource.get(name);
        } catch (Exception e) {
            LOG.error("從Redis連接配接池中擷取連接配接異常!異常消息:", e);
        } finally {
            if (resource != null) {
                try {
                    resource.close();
                    resource = null;
                } catch (Exception e) {
                    LOG.warn("返還連接配接異常!異常消息:", e);
                }
            }
        }
        return userInfo;
    }
}
           

3.RedisDemo

package redis;

public class RedisDemo {
    public static void main(String[] args) {
        //哨兵模式
        String clusterName = "mymaster";
        String redisIP = "ml20.com:26379,ml21.com:26379,ml22.com:26379";
        String redisAuth = "";
        RedisSentinelUtil.getPool(clusterName, redisIP, redisAuth);
        String aaron = RedisSentinelUtil.getUserInfo("Aaron");
        System.out.println(aaron);
        //叢集模式
        String redisIP2 = "ml11.com:6379,ml12.com:6379,ml13.com:6379";
        RedisClusterUtil.getPool(redisIP2);
        String aaron2 = RedisClusterUtil.getUserInfo("Aaron");
        System.out.println(aaron2);
    }
}

           

====================================================================

@羲凡——隻為了更好的活着

若對部落格中有任何問題,歡迎留言交流