package com.iminer.weibosearch.sina;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import com.iminer.disframe.UserConfiguration;
public class RedisService {
private JedisPool pool = null;
private JedisPool backup_pool = null;
private static final Logger logger = Logger.getLogger(RedisService.class);
private static final int redis_pool_max_active = UserConfiguration.getInstance().getInt("wss.redis.pool.maxActive", 50);
private static final int redis_pool_max_idle = UserConfiguration.getInstance().getInt("wss.redis.pool.maxIdle", 10);
private static final int redis_pool_max_wait = UserConfiguration.getInstance().getInt("wss.redis.pool.maxWait", 10);
private static final long TimeBetweenEvictionRunsMillis = UserConfiguration.getInstance()
.getLong("wss.redis.pool.timeBetweenEvictionRunsMillis", 15000);
private static final long MinEvictableIdleTimeMillis = UserConfiguration.getInstance()
.getLong("wss.redis.pool.minEvictableIdleTimeMillis", 10000);
private static String redis_ip_inner = UserConfiguration.getInstance().get("wss.redis.ip.inner");
private static String redis_ip_out = UserConfiguration.getInstance().get("wss.redis.ip.out");
private static final int redis_port = UserConfiguration.getInstance().getInt("wss.redis.port", 6379);
private static final int conn_fail_retry = UserConfiguration.getInstance().getInt("wss.redis.pool.conn.fail.retry", 10);
private static final int conn_fail_retry_interval = UserConfiguration.getInstance().getInt("wss.redis.pool.conn.fail.retry.interval.second", 10);
private static RedisService instance = new RedisService();
private RedisService() {
initPool();
}
public static RedisService getInstance() {
return instance;
}
private void initPool() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(redis_pool_max_active);
config.setMaxIdle(redis_pool_max_idle);
// 不要设置minIdle,否则会抛出超时错误! config.setMinIdle(ConfigLoader.MIN_IDLE);
config.setTestWhileIdle(true);
config.setNumTestsPerEvictionRun(-1);
config.setMaxWait(redis_pool_max_wait);
config.setTimeBetweenEvictionRunsMillis(TimeBetweenEvictionRunsMillis);
config.setMinEvictableIdleTimeMillis(MinEvictableIdleTimeMillis);
// //怀疑这个地方有问题以前设置true,在每次建立连接之前都要校验连接的正确性
config.setTestOnBorrow(true);
String redis_ip = redis_ip_inner;
if(System.getProperty("os.name").contains("indows")) {
// 外网
redis_ip = redis_ip_out;
}
pool = new JedisPool(config, redis_ip, redis_port, 120000);
logger.info("Redis pool configuration: " + ToStringBuilder.reflectionToString(config));
}
public Jedis getConnection() {
try {
Jedis jedis = pool.getResource();
return jedis;
} catch(Exception e) {
e.printStackTrace();
logger.info("Cannot get a connection: " + e.getMessage());
return null;
}
}
public Jedis getConnectionWithRetry() {
Jedis conn = null;
for(int i = 0; i < conn_fail_retry; i++) {
conn = getConnection();
if(conn != null)
break;
logger.info("Wait for " + conn_fail_retry_interval + " seconds and retry: " + (i + 1) + "/" + conn_fail_retry);
try {
Thread.sleep(conn_fail_retry_interval * 1000L);
} catch(Exception e) {
e.printStackTrace();
break;
}
}
return conn;
}
public void closeConnection(Jedis connection) {
if(connection == null)
return;
try {
pool.returnResource(connection);
} catch(Exception e) {
pool.returnBrokenResource(connection);
e.printStackTrace();
logger.info("Cannot return connection: " + e.getMessage());
}
}
public void destoryPool() {
pool.destroy();
if(backup_pool != null)
backup_pool.destroy();
}
public String info(Jedis conn) {
return conn.info();
}
}
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import com.iminer.disframe.UserConfiguration;
public class RedisService {
private JedisPool pool = null;
private JedisPool backup_pool = null;
private static final Logger logger = Logger.getLogger(RedisService.class);
private static final int redis_pool_max_active = UserConfiguration.getInstance().getInt("wss.redis.pool.maxActive", 50);
private static final int redis_pool_max_idle = UserConfiguration.getInstance().getInt("wss.redis.pool.maxIdle", 10);
private static final int redis_pool_max_wait = UserConfiguration.getInstance().getInt("wss.redis.pool.maxWait", 10);
private static final long TimeBetweenEvictionRunsMillis = UserConfiguration.getInstance()
.getLong("wss.redis.pool.timeBetweenEvictionRunsMillis", 15000);
private static final long MinEvictableIdleTimeMillis = UserConfiguration.getInstance()
.getLong("wss.redis.pool.minEvictableIdleTimeMillis", 10000);
private static String redis_ip_inner = UserConfiguration.getInstance().get("wss.redis.ip.inner");
private static String redis_ip_out = UserConfiguration.getInstance().get("wss.redis.ip.out");
private static final int redis_port = UserConfiguration.getInstance().getInt("wss.redis.port", 6379);
private static final int conn_fail_retry = UserConfiguration.getInstance().getInt("wss.redis.pool.conn.fail.retry", 10);
private static final int conn_fail_retry_interval = UserConfiguration.getInstance().getInt("wss.redis.pool.conn.fail.retry.interval.second", 10);
private static RedisService instance = new RedisService();
private RedisService() {
initPool();
}
public static RedisService getInstance() {
return instance;
}
private void initPool() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(redis_pool_max_active);
config.setMaxIdle(redis_pool_max_idle);
// 不要设置minIdle,否则会抛出超时错误! config.setMinIdle(ConfigLoader.MIN_IDLE);
config.setTestWhileIdle(true);
config.setNumTestsPerEvictionRun(-1);
config.setMaxWait(redis_pool_max_wait);
config.setTimeBetweenEvictionRunsMillis(TimeBetweenEvictionRunsMillis);
config.setMinEvictableIdleTimeMillis(MinEvictableIdleTimeMillis);
// //怀疑这个地方有问题以前设置true,在每次建立连接之前都要校验连接的正确性
config.setTestOnBorrow(true);
String redis_ip = redis_ip_inner;
if(System.getProperty("os.name").contains("indows")) {
// 外网
redis_ip = redis_ip_out;
}
pool = new JedisPool(config, redis_ip, redis_port, 120000);
logger.info("Redis pool configuration: " + ToStringBuilder.reflectionToString(config));
}
public Jedis getConnection() {
try {
Jedis jedis = pool.getResource();
return jedis;
} catch(Exception e) {
e.printStackTrace();
logger.info("Cannot get a connection: " + e.getMessage());
return null;
}
}
public Jedis getConnectionWithRetry() {
Jedis conn = null;
for(int i = 0; i < conn_fail_retry; i++) {
conn = getConnection();
if(conn != null)
break;
logger.info("Wait for " + conn_fail_retry_interval + " seconds and retry: " + (i + 1) + "/" + conn_fail_retry);
try {
Thread.sleep(conn_fail_retry_interval * 1000L);
} catch(Exception e) {
e.printStackTrace();
break;
}
}
return conn;
}
public void closeConnection(Jedis connection) {
if(connection == null)
return;
try {
pool.returnResource(connection);
} catch(Exception e) {
pool.returnBrokenResource(connection);
e.printStackTrace();
logger.info("Cannot return connection: " + e.getMessage());
}
}
public void destoryPool() {
pool.destroy();
if(backup_pool != null)
backup_pool.destroy();
}
public String info(Jedis conn) {
return conn.info();
}
}