这里写链接内容
Java在使用jedis操作redis数据时,遇到坑,各种查资料解决了将近1天才实现结果。
坑1:
直接在Idea里面,建TestNG的Test类时,
里面的多线程代码,一直会提示报错,没有任何提示,直接就test任务结束。
解决方案:使用main建入口的方式进行测试,千万不要使用testng的@Test注解这种方式进行测试。
原因,估计是多线程引起的。怎么弄还不明白,只能换成main方法里面去执行多线程。
坑2:
多线程并发会造成冲突,会报各种错。
解决方法:使用JRedisPool建立线程池。
而且在操作时,使用synchronized把操作方法进行封装。否则依然会报错。
坑3:
超出线程池容量。1000个线程,会报大量的错。
解决方法:
JedisPoolConfig里面设置
private static String ADDR_ARRAY = "127.0.0.1";
private static int PORT = 6379;
private static String AUTH = "";
private static int MAX_ACTIVE = 500;
private static int MAX_IDLE = 100;
private static int MAX_WAIT = 10 * 1000;
private static int TIMEOUT = 10 * 1000;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 初始化Redis连接池
*/
private static void initialPool() {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
config.setTestWhileIdle(true);
config.setTestOnReturn(true);
if (StringUtils.isNotBlank(AUTH)) {
jedisPool = new JedisPool(config, ADDR_ARRAY.split(",")[0], PORT, TIMEOUT, AUTH);
} else {
jedisPool = new JedisPool(config, ADDR_ARRAY.split(",")[0], PORT, TIMEOUT);
}
} catch (Exception e) {
logger.error("First create JedisPool error : " + e);
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR_ARRAY.split(",")[1], PORT, TIMEOUT, AUTH);
} catch (Exception e2) {
logger.error("Second create JedisPool error : " + e2);
}
}
}
/**
* 在多线程环境同步初始化
*/
private static synchronized void poolInit() {
if (jedisPool == null) {
initialPool();
}
}
/**
* 同步获取Jedis实例
*
* @return Jedis
*/
public synchronized static Jedis getJedis() {
if (jedisPool == null) {
poolInit();
}
Jedis jedis = null;
try {
if (jedisPool != null) {
jedis = jedisPool.getResource();
}
} catch (Exception e) {
logger.error("Get jedis Error : " + e.getMessage(), e);
} finally {
returnResource(jedis);
}
return jedis;
}
/**
* 释放jedis资源
*
* @param jedis
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null && jedisPool != null) {
jedisPool.returnResource(jedis);
}
}
/**
* 关闭连接池
*/
public static void closePool() {
if (jedisPool != null) {
jedisPool.close();
}
}
/**
* 设置 String
*
* @param key
* @param value
*/
public synchronized static void setString(String key, String value) {
try {
value = StringUtils.isEmpty(value) ? "" : value;
getJedis().set(key, value);
} catch (Exception e) {
logger.error("Set key error : " + e);
}
}
/**
* 设置 过期时间
*
* @param key
* @param seconds 以秒为单位
* @param value
*/
public synchronized static void setString(String key, int seconds, String value) {
try {
value = StringUtils.isEmpty(value) ? "" : value;
getJedis().setex(key, seconds, value);
} catch (Exception e) {
logger.error("Set keyex error : " + e);
}
}
/**
* 获取String值
*
* @param key
* @return value
*/
public synchronized static String getString(String key) {
if (getJedis() == null || !getJedis().exists(key)) {
return null;
}
return getJedis().get(key);
}
}