@羲凡——隻為了更好的活着
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);
}
}
====================================================================
@羲凡——隻為了更好的活着
若對部落格中有任何問題,歡迎留言交流