packagecom.liying.monkey.core.util;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.HashSet;importjava.util.List;importjava.util.Map;importjava.util.Set;importorg.apache.commons.collections.CollectionUtils;importorg.apache.commons.lang3.StringUtils;importorg.apache.commons.lang3.math.NumberUtils;importorg.apache.log4j.Logger;importredis.clients.jedis.Jedis;importredis.clients.jedis.JedisPool;importredis.clients.jedis.JedisPoolConfig;importcom.liying.monkey.core.common.Constants.Zero;public classRedisUtil {private static final Logger log = Logger.getLogger(RedisUtil.class);//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = 15 * 1000;//超时时间
private static int TIMEOUT = 10 * 1000;private static JedisPool jedisPool = null;/*** Jedis实例获取返回码
*
*@authorjqlin
**/
public static classJedisStatus{/**Jedis实例获取失败*/
public static final long FAIL_LONG = -5L;/**Jedis实例获取失败*/
public static final int FAIL_INT = -5;/**Jedis实例获取失败*/
public static final String FAIL_STRING = "-5";
}private static voidinitialPool() {//Redis服务器IP
String HOST = PropertyReader.get("redis.native.host");//Redis的端口号
int PORT = NumberUtils.toInt(PropertyReader.get("redis.native.port"), 6379);//访问密码
String AUTH = PropertyReader.get("redis.native.password");try{
JedisPoolConfig config= newJedisPoolConfig();//最大连接数,如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
config.setMaxTotal(NumberUtils.toInt(PropertyReader.get("redis.native.maxTotal"), 400));//最大空闲数,控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
config.setMaxIdle(NumberUtils.toInt(PropertyReader.get("redis.native.maxIdle"), 50));//最小空闲数
config.setMinIdle(NumberUtils.toInt(PropertyReader.get("redis.native.minIdle"), 10));//是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
config.setTestOnBorrow(true);//在return给pool时,是否提前进行validate操作
config.setTestOnReturn(true);//在空闲时检查有效性,默认false
config.setTestWhileIdle(true);//表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;//这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
config.setMinEvictableIdleTimeMillis(30000);//表示idle object evitor两次扫描之间要sleep的毫秒数
config.setTimeBetweenEvictionRunsMillis(60000);//表示idle object evitor每次扫描的最多的对象数
config.setNumTestsPerEvictionRun(1000);//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
config.setMaxWaitMillis(MAX_WAIT);if(StringUtils.isNotBlank(AUTH)) {
jedisPool= newJedisPool(config, HOST, PORT, TIMEOUT, AUTH);
}else{
jedisPool= newJedisPool(config, HOST, PORT, TIMEOUT);
}
}catch(Exception e) {if(jedisPool != null){
jedisPool.close();
}
log.error("初始化Redis连接池失败", e);
}
}/*** 初始化Redis连接池*/
static{
initialPool();
}/*** 在多线程环境同步初始化*/
private static synchronized voidpoolInit() {if (jedisPool == null) {
initialPool();
}
}/*** 同步获取Jedis实例
*
*@returnJedis*/
public staticJedis getJedis() {if (jedisPool == null) {
poolInit();
}
Jedis jedis= null;try{if (jedisPool != null) {
jedis=jedisPool.getResource();
}
}catch(Exception e) {
log.error("同步获取Jedis实例失败" +e.getMessage(), e);
returnBrokenResource(jedis);
}returnjedis;
}/*** 释放jedis资源
*
*@paramjedis*/@SuppressWarnings("deprecation")public static void returnResource(finalJedis jedis) {if (jedis != null && jedisPool != null) {
jedisPool.returnResource(jedis);
}
}
@SuppressWarnings("deprecation")public static void returnBrokenResource(finalJedis jedis) {if (jedis != null && jedisPool != null) {
jedisPool.returnBrokenResource(jedis);
}
}/*** 设置值
*
*@paramkey
*@paramvalue
*@return-5:Jedis实例获取失败
OK:操作成功
null:操作失败
*@authorjqlin*/
public staticString set(String key, String value) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_STRING;
}
String result= null;try{
result=jedis.set(key, value);
}catch(Exception e) {
log.error("设置值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 设置值
*
*@paramkey
*@paramvalue
*@paramexpire 过期时间,单位:秒
*@return-5:Jedis实例获取失败
OK:操作成功
null:操作失败
*@authorjqlin*/
public static String set(String key, String value, intexpire) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_STRING;
}
String result= null;try{
result=jedis.set(key, value);
jedis.expire(key, expire);
}catch(Exception e) {
log.error("设置值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 获取值
*
*@paramkey
*@return*@authorjqlin*/
public staticString get(String key) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_STRING;
}
String result= null;try{
result=jedis.get(key);
}catch(Exception e) {
log.error("获取值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 设置key的过期时间
*
*@paramkey
*@paramvalue -5:Jedis实例获取失败,1:成功,0:失败
*@return*@authorjqlin*/
public static long expire(String key, intseconds) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_LONG;
}long result =Zero.LONG;try{
result=jedis.expire(key, seconds);
}catch(Exception e) {
log.error(String.format("设置key=%s的过期时间失败:" +e.getMessage(), key), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 判断key是否存在
*
*@paramkey
*@return*@authorjqlin*/
public static booleanexists(String key) {
Jedis jedis=getJedis();if(jedis == null){
log.warn("Jedis实例获取为空");return false;
}boolean result = false;try{
result=jedis.exists(key);
}catch(Exception e) {
log.error(String.format("判断key=%s是否存在失败:" +e.getMessage(), key), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 删除key
*
*@paramkeys
*@return-5:Jedis实例获取失败,1:成功,0:失败
*@authorjqlin*/
public static longdel(String... keys) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_LONG;
}long result =JedisStatus.FAIL_LONG;try{
result=jedis.del(keys);
}catch(Exception e) {
log.error(String.format("删除key=%s失败:" +e.getMessage(), keys), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** set if not exists,若key已存在,则setnx不做任何操作
*
*@paramkey
*@paramvalue key已存在,1:key赋值成功
*@return*@authorjqlin*/
public static longsetnx(String key, String value) {long result =JedisStatus.FAIL_LONG;
Jedis jedis=getJedis();if(jedis == null){returnresult;
}try{
result=jedis.setnx(key, value);
}catch(Exception e) {
log.error("设置值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** set if not exists,若key已存在,则setnx不做任何操作
*
*@paramkey
*@paramvalue key已存在,1:key赋值成功
*@paramexpire 过期时间,单位:秒
*@return*@authorjqlin*/
public static long setnx(String key, String value, intexpire) {long result =JedisStatus.FAIL_LONG;
Jedis jedis=getJedis();if(jedis == null){returnresult;
}try{
result=jedis.setnx(key, value);
jedis.expire(key, expire);
}catch(Exception e) {
log.error("设置值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 在列表key的头部插入元素
*
*@paramkey
*@paramvalues -5:Jedis实例获取失败,>0:返回操作成功的条数,0:失败
*@return*@authorjqlin*/
public static longlpush(String key, String... values) {long result =JedisStatus.FAIL_LONG;
Jedis jedis=getJedis();if(jedis == null){returnresult;
}try{
result=jedis.lpush(key, values);
}catch(Exception e) {
log.error("在列表key的头部插入元素失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 在列表key的尾部插入元素
*
*@paramkey
*@paramvalues -5:Jedis实例获取失败,>0:返回操作成功的条数,0:失败
*@return*@authorjqlin*/
public static longrpush(String key, String... values) {long result =JedisStatus.FAIL_LONG;
Jedis jedis=getJedis();if(jedis == null){returnresult;
}try{
result=jedis.rpush(key, values);
}catch(Exception e) {
log.error("在列表key的尾部插入元素失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 返回存储在key列表的特定元素
*
*
*@paramkey
*@paramstart 开始索引,索引从0开始,0表示第一个元素,1表示第二个元素
*@paramend 结束索引,-1表示最后一个元素,-2表示倒数第二个元素
*@returnredis client获取失败返回null
*@authorjqlin*/
public static List lrange(String key, long start, longend) {
Jedis jedis=getJedis();if(jedis == null){return null;
}
List result = null;try{
result=jedis.lrange(key, start, end);
}catch(Exception e) {
log.error("查询列表元素失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 获取List缓存对象
*
*@paramkey
*@paramstart
*@paramend
*@returnList 返回类型
*@authorjqlin*/
public static List range(String key, long start, long end, Classclazz){
List dataList =lrange(key, start, end);if(CollectionUtils.isEmpty(dataList)){return new ArrayList();
}returnJavaJsonConvert.json2List(dataList.toString(), clazz);
}/*** 获取列表长度
*
*@paramkey -5:Jedis实例获取失败
*@return*@authorjqlin*/
public static longllen(String key) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_LONG;
}long result = 0;try{
result=jedis.llen(key);
}catch(Exception e) {
log.error("获取列表长度失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 移除等于value的元素
* 当count>0时,从表头开始查找,移除count个;
* 当count=0时,从表头开始查找,移除所有等于value的;
* 当count<0时,从表尾开始查找,移除count个
*
*@paramkey
*@paramcount
*@paramvalue
*@return-5:Jedis实例获取失败
*@authorjqlin*/
public static long lrem(String key, longcount, String value) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_LONG;
}long result = 0;try{
result=jedis.lrem(key, count, value);
}catch(Exception e) {
log.error("获取列表长度失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 对列表进行修剪
*
*@paramkey
*@paramstart
*@paramend
*@return-5:Jedis实例获取失败,OK:命令执行成功
*@authorjqlin*/
public static String ltrim(String key, long start, longend) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_STRING;
}
String result= "";try{
result=jedis.ltrim(key, start, end);
}catch(Exception e) {
log.error("获取列表长度失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 设置对象
*
*@paramkey
*@paramobj
*@return*@authorjqlin*/
public static String setObject(String key ,T obj){
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_STRING;
}
String result= null;try{byte[] data=SerializeUtil.serialize(obj);
result=jedis.set(key.getBytes(), data);
}catch(Exception e) {
log.error("设置对象失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 获取对象
*
*@paramkey
*@return*@authorjqlin*/@SuppressWarnings("unchecked")public static T getObject(String key){
Jedis jedis=getJedis();if(jedis == null){return null;
}
T result= null;try{byte[] data =jedis.get(key.getBytes());if(data != null && data.length > 0){
result=(T)SerializeUtil.unserialize(data);
}
}catch(Exception e) {
log.error("获取对象失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 设置List集合(慎用)
*
*@paramkey
*@paramdataList
*@return*@authorjqlin*/
public synchronized static T setList(String key, ListdataList){
Jedis jedis=getJedis();if(jedis == null){return null;
}
T result= null;try{
List list =getList(key);if(CollectionUtils.isNotEmpty(list)){
dataList.addAll(list);
}if(CollectionUtils.isNotEmpty(dataList)){byte[] data =SerializeUtil.serializeToList(dataList);
jedis.set(key.getBytes(), data);
}else{//如果list为空,则设置一个空
jedis.set(key.getBytes(), "".getBytes());
}
}catch(Exception e) {
log.error("设置List集合失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 获取List集合(慎用)
*
*@paramkey
*@return*@authorjqlin*/
public static ListgetList(String key){
Jedis jedis=getJedis();if(jedis == null){return null;
}try{byte[] data =getJedis().get(key.getBytes());if(data != null && data.length > 0){returnSerializeUtil.unserializeToList(data);
}
}catch(Exception e) {
log.error("获取List集合失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}return null;
}/*** 缓存Map赋值
*
*@paramkey
*@paramfield
*@paramvalue
*@return-5:Jedis实例获取失败
*@authorjqlin*/
public static longhset(String key, String field, String value) {
Jedis jedis=getJedis();if(jedis == null){returnJedisStatus.FAIL_LONG;
}long result = 0L;try{
result=jedis.hset(key, field, value);
}catch(Exception e) {
log.error("缓存Map赋值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 获取缓存的Map值
*
*@paramkey
*@return
*/
public staticString hget(String key, String field){
Jedis jedis=getJedis();if(jedis == null){return null;
}
String result= null;try{
result=jedis.hget(key, field);
}catch(Exception e) {
log.error("获取缓存的Map值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnresult;
}/*** 获取map所有的字段和值
*
*@paramkey
*@return*@authorjqlin*/
public static MaphgetAll(String key){
Map map = new HashMap();
Jedis jedis=getJedis();if(jedis == null){
log.warn("Jedis实例获取为空");returnmap;
}try{
map=jedis.hgetAll(key);
}catch(Exception e) {
log.error("获取map所有的字段和值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnmap;
}/*** 查看哈希表 key 中,指定的field字段是否存在。
*
*@paramkey
*@paramfield
*@return*@authorjqlin*/
public staticBoolean hexists(String key, String field){
Jedis jedis=getJedis();if(jedis == null){
log.warn("Jedis实例获取为空");return null;
}try{returnjedis.hexists(key, field);
}catch(Exception e) {
log.error("查看哈希表field字段是否存在失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}return null;
}/*** 获取所有哈希表中的字段
*
*@paramkey
*@return*@authorjqlin*/
public static Sethkeys(String key) {
Set set = new HashSet();
Jedis jedis=getJedis();if(jedis == null){
log.warn("Jedis实例获取为空");returnset;
}try{returnjedis.hkeys(key);
}catch(Exception e) {
log.error("获取所有哈希表中的字段失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}return null;
}/*** 获取所有哈希表中的值
*
*@paramkey
*@return*@authorjqlin*/
public static Listhvals(String key) {
List list = new ArrayList();
Jedis jedis=getJedis();if(jedis == null){
log.warn("Jedis实例获取为空");returnlist;
}try{returnjedis.hvals(key);
}catch(Exception e) {
log.error("获取所有哈希表中的值失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}return null;
}/*** 从哈希表 key 中删除指定的field
*
*@paramkey
*@paramfield
*@return*@authorjqlin*/
public static longhdel(String key, String... fields){
Jedis jedis=getJedis();if(jedis == null){
log.warn("Jedis实例获取为空");returnJedisStatus.FAIL_LONG;
}try{returnjedis.hdel(key, fields);
}catch(Exception e) {
log.error("map删除指定的field失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}return 0;
}public static Setkeys(String pattern){
Set keyList = new HashSet();
Jedis jedis=getJedis();if(jedis == null){
log.warn("Jedis实例获取为空");returnkeyList;
}try{
keyList=jedis.keys(pattern);
}catch(Exception e) {
log.error("操作keys失败:" +e.getMessage(), e);
returnBrokenResource(jedis);
}finally{
returnResource(jedis);
}returnkeyList;
}public static void main(String[] args) throwsIOException {//System.out.println(hset("map", "a","3"));//System.out.println(hset("map", "b","3"));//System.out.println(hset("map", "c","3"));
Set set = keys("lock*");for(String key : set){
System.out.println(key);
}
}
}