import java.util.Arrays;

import java.util.List;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

public class RedisUtils {
// Redis服务器IP
private static String ADDR = "localhost";

// Redis的端口号
private static int PORT = 6379;

// 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
// private static String AUTH = "123456";

// 可用连接实例的最大数目,默认值为8;
private static int MAX_TOTAL = 512;

// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 50;

// 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
private static int MAX_WAIT = -1;

private static int TIMEOUT = 100000;

// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;

private static JedisPool jedisPool = null;

private static List<JedisShardInfo> shards = null;

private static ShardedJedisPool shardedJedisPool = null;

private static Object lock = new Object();

public static void setADDR(String aDDR, int port) {
ADDR = aDDR;
PORT = port;
}

private static Logger log = Logger.getLogger(RedisUtils.class);

/**
* 初始化Redis连接池
*/
private static void initJedisPool() {
synchronized (lock) {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_TOTAL);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
} catch (Exception e) {
log.error("initJedisPool出错:" + e);
}
}
}

private static void initShardedJedisPool() {
synchronized (lock) {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_TOTAL);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
JedisShardInfo info = new JedisShardInfo(ADDR, PORT);
info.setTimeout(TIMEOUT);
shards = Arrays.asList(info);
shardedJedisPool = new ShardedJedisPool(config, shards);
} catch (Exception e) {
log.error("initShardedJedisPool出错:" + e);
}
}
}

/**
* 获取shardedJedis实例
* @return
*/
public static ShardedJedis getShardedJedis() {
try {
if (shardedJedisPool == null) {
initShardedJedisPool();
}
ShardedJedis jedis = shardedJedisPool.getResource();
return jedis;
} catch (Exception e) {
log.error("getShardedJedis出错:" + e);
return null;
}
}

/**
* 释放shardedJedis资源
* @param jedis
*/
public static void returnShardedResource(final ShardedJedis jedis) {
if (jedis != null) {
shardedJedisPool.returnResource(jedis);
}
}

/**
* 获取Jedis实例
* @return
*/
public static Jedis getJedis() {
try {
if (jedisPool == null) {
initJedisPool();
}
Jedis jedis = jedisPool.getResource();
return jedis;
} catch (Exception e) {
log.error("getJedis出错:" + e);
return null;
}
}

/**
* 释放jedis资源
* @param jedis
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}

/**
* 根据key值来获取对应的数据
* @param key
* @return
*/
public static String getString(final String key) {
String result = "";
try (Jedis jedis = getJedis()) {
if (StringUtils.isEmpty(key)) {
return result;
}
result = jedis.get(key);
} catch (Exception e) {
log.error("get String fail", e);
}
return result;
}

/**
* 设置缓存
* @param key
* @param values
*/
public static void setString(final String key, final String values) {
try (Jedis jedis = getJedis()) {
if (StringUtils.isEmpty(key)) {
return;
}
jedis.set(key, values);
} catch (Exception e) {
log.error("set String fail", e);
}

}

/**
* 根据key值来删除缓存
* @param key
* @return
*/
public static long delKey(final String key) {
long result = 0;
try (Jedis jedis = getJedis()) {
if (StringUtils.isEmpty(key)) {
return result;
}
result = jedis.del(key);
} catch (Exception e) {
log.error("del key fail", e);
}
return result;
}

/**
* 生成key genKey
* @param projectId
* @param module
* @param unit
* @return String
*/
public static String genKey(String projectId, String module, String unit) {
StringBuilder builder = new StringBuilder();
builder.append(unit);
builder.append("_");
builder.append(module);
builder.append(projectId);
return builder.toString();
}

/**
* 设置键值 setString
* @param key
* @param values
* @param seconds
*/
public static void setString(final String key, final String values, final int seconds) {
try (Jedis jedis = getJedis()) {
if (StringUtils.isEmpty(key)) {
return;
}
jedis.setex(key, seconds, values);
} catch (Exception e) {
log.error("set String and expire fail ", e);
}
}

public synchronized static void deleteKey(String... keys) {
try (Jedis jedis = getJedis()) {

jedis.del(keys);
} catch (Exception e) {
log.error("delete key[] fail ", e);
}
}

public synchronized static void deleteKeys(String pattern) {
try (Jedis jedis = getJedis()) {
Set<String> keySet = jedis.keys(pattern);
if (keySet == null || keySet.size() <= 0) {
return;
}
String keyArr[] = new String[keySet.size()];
int i = 0;
for (String keys : keySet) {
keyArr[i] = keys;
i++;
}
deleteKey(keyArr);
} catch (Exception e) {
log.error("delete keys by pattern fail ", e);
}

}

public synchronized static void deleteKeyByPrefix(String prefix) {
deleteKeys(prefix + "*");
}

public synchronized static void deleteKeyByContain(String contain) {
deleteKeys("*" + contain + "*");
}

}

最新文章

  1. 墙裂推荐4款js网页烟花特效
  2. Android进程保活
  3. EasyUI、Struts2、Hibernate、spring 框架整合
  4. Android 坐标系统
  5. ubuntu上mysql服务器安装后只能本地连接不能远程连接的问题
  6. 静态页分页功能js代码
  7. ionic cordova social media sharing plugin
  8. Linux使用有线上网教程
  9. 文件结束符和C\C++读取文件方式
  10. Subversion安装和使用
  11. 从零开始学习jQuery (九) jQuery工具函数
  12. JSP基础学习(二)
  13. poj 2411 Mondriaan&#39;s Dream 轮廓线dp
  14. Intellj IDEA 简易教程
  15. ARM-GPIO
  16. Halcon 2D测量
  17. linux下安装jre运行环境
  18. 该内存不能为written
  19. 关于Unity中使用刚体制作简单跑酷案例
  20. BZOJ3436: 小K的农场(差分约束裸题&amp;DFS优化判环)

热门文章

  1. APUE 12.7 取消选项
  2. 3-urllib的post请求方式
  3. 【转载】MySQl 数据库插入加锁分析
  4. 利用xlst导出多表头的简便方法
  5. 自定义input[type=&quot;checkbox&quot;]的样式
  6. 批量删除Redis中的数据
  7. Day6 jQuery
  8. 多线程之线程间协作的两种方式:wait、notify、notifyAll和Condition
  9. JSONP - 从理论到实践
  10. ZOJ 2475 Benny&#39;s Compiler(dfs判断有向图给定点有没有参与构成环)