package com.shd.core.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.shd.core.basebiz.dto.TempData;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisUtil {
private static JedisPool jedisPool;// 非切片连接池
private static String maxTotal = RedisConfig.getProperty("redis.pool.maxTotal", "1000");
private static String maxIdle = RedisConfig.getProperty("redis.pool.maxIdle", "100");
private static String minIdle = RedisConfig.getProperty("redis.pool.minIdle", "50");
private static String maxWaitMillis = RedisConfig.getProperty("redis.pool.maxWaitMillis", "10000");
private static String testOnBorrow = RedisConfig.getProperty("redis.pool.testOnBorrow", "true");
private static String testOnReturn = RedisConfig.getProperty("redis.pool.testOnReturn", "true");
private static String testWhileIdle = RedisConfig.getProperty("redis.pool.testWhileIdle", "true");
private static String ntper = RedisConfig
.getProperty("redis.pool.numTestsPerEvictionRun", "50");
private static String tberm = RedisConfig.getProperty(
"redis.pool.timeBetweenEvictionRunsMillis","30000");
private static String ip = RedisConfig.getProperty("redis.ip", "127.0.0.1");
private static int port = Integer.parseInt(RedisConfig.getProperty("redis.port","6379"));
private static int timeout = Integer.parseInt(RedisConfig.getProperty(
"redis.timeout", "10000"));
/**
* 初始化连接池
*/
private static void initialPool() {
if (jedisPool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(maxTotal));
config.setMaxIdle(Integer.parseInt(maxIdle));
config.setMinIdle(Integer.parseInt(minIdle));
config.setMaxWaitMillis(Integer.parseInt(maxWaitMillis));
config.setTestOnBorrow(Boolean.parseBoolean(testOnBorrow));
config.setTestOnReturn(Boolean.parseBoolean(testOnReturn));
config.setTestWhileIdle(Boolean.parseBoolean(testWhileIdle));
config.setNumTestsPerEvictionRun(Integer.parseInt(ntper));
config.setTimeBetweenEvictionRunsMillis(Integer.parseInt(tberm));
jedisPool = new JedisPool(config, ip, port, timeout);
}
}
/**
* 从池中获取jedis实例
* @return jedis实例
*/
private/* synchronized */static Jedis getJedis() throws Exception {
if (jedisPool == null) {
initialPool();
}
Jedis jedis = null;
if (jedisPool != null) {
jedis = jedisPool.getResource();
}
return jedis;
}
/**
* 存储字符串
* @param redisKey 标识符(以“STR-”开头)
* @param val 字符串
*/
public static void setString(String redisKey, String val) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.set(redisKey, val);
} catch (Exception e) {
returnResource(jedis);
} finally {
returnResource(jedis);
}
}
/**
* 根据标识符获取存储的字符串
* @param redisKey 标识符
* @return 存储的字符串
*/
public static String getString(String redisKey) {
if (!exists(redisKey)) {
return null;
}
Jedis jedis = null;
try {
jedis = getJedis();
String val = jedis.get(redisKey);
return val;
} catch (Exception e) {
e.printStackTrace();
returnResource(jedis);
} finally {
returnResource(jedis);
}
return null;
}
/**
* 存储对象
* @param redisKey 标识符(以“OBJ-”开头)
* @param obj 对象(必须序列化,实现Serializable接口)
*/
public static void setObject(String redisKey, Object obj) {
Jedis jedis = null;
try {
jedis = getJedis();
getJedis().set(redisKey.getBytes(), serialize(obj));
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 根据标识符获取对象
* @param redisKey 标识符
* @return 对象(必须序列化,实现Serializable接口)
*/
public static Object getObject(String redisKey) {
if (!exists(redisKey)) {
return null;
}
Jedis jedis = null;
try {
jedis = getJedis();
byte[] byt = getJedis().get(redisKey.getBytes());
Object obj = unserizlize(byt);
return obj;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 存储list集合
* @param redisKey 标识符(以“LIST-”开头)
* @param list 集合
* @param isCover 是否覆盖
* true:覆盖 false:不覆盖,追加数据
*/
public static void setList(String redisKey, List<Object> list,
boolean isCover) {
Jedis jedis = null;
try {
jedis = getJedis();
if (isCover) {
jedis.del(redisKey);
}
for (Object object : list) {
jedis.rpush(redisKey.getBytes(), serialize(object));
}
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 添加对象到list集合
* @param redisKey 标识符
* @param Object 对象
*/
public static void pushObjectToList(String redisKey, Object object) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.rpush(redisKey.getBytes(), serialize(object));
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 根据标识符获取List集合
* @param redisKey 标识符
* @return list 集合
*/
public static List<Object> popList(String redisKey) {
Jedis jedis = null;
try {
jedis = getJedis();
if (!exists(redisKey)) {
return null;
}
List<Object> list = new ArrayList<Object>();
Long len = jedis.llen(redisKey);
for (int i = 0; i < len; i++) {
byte[] byt = jedis.lpop(redisKey.getBytes());
Object obj = unserizlize(byt);
list.add(obj);
}
return list;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 根据标识符获取List集合
* @param redisKey 标识符
* @return list集合
*/
public static List<Object> getList(String redisKey) {
Jedis jedis = null;
try {
jedis = getJedis();
if (!exists(redisKey)) {
return null;
}
List<Object> list = new ArrayList<Object>();
Long len = jedis.llen(redisKey);
for (int i = 0; i < len; i++) {
byte[] byt = jedis.lindex(redisKey.getBytes(), i);
Object obj = unserizlize(byt);
list.add(obj);
}
return list;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 根据标识符和List集合的下标获取对象
* @param redisKey 标识符
* @param index 下标(-1表示最后的下标)
* @return 对象
*/
public static Object getListObjectByIndex(String redisKey, int index) {
Jedis jedis = null;
try {
jedis = getJedis();
if (!exists(redisKey)) {
return null;
}
Long len = jedis.llen(redisKey);
if (index >= len) {
return null;
}
byte[] byt = jedis.lindex(redisKey.getBytes(), index);
Object obj = unserizlize(byt);
return obj;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
return null;
} finally {
returnResource(jedis);
}
}
/**
* 根据标识符移除头部对象,并获取该对象
* @param redisKey 标识符
* @return 对象
*/
public static Object popListObject(String redisKey) {
Jedis jedis = null;
try {
jedis = getJedis();
if (!exists(redisKey)) {
return null;
}
byte[] byt = jedis.lpop(redisKey.getBytes());
Object obj = unserizlize(byt);
return obj;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 根据标识符和List集合的起始位置、结束位置获取对象
* @param redisKey 标识符
* @param index 起始位置
* @param index 结束为止(-1表示最后的位置)
* @return 对象
*/
public static List<Object> getListByRegion(String redisKey, int start,
int end) {
Jedis jedis = null;
try {
jedis = getJedis();
if (!exists(redisKey)) {
return null;
}
List<Object> resultList = new ArrayList<Object>();
List<byte[]> list = jedis.lrange(redisKey.getBytes(), start, end);
for (byte[] byt : list) {
Object obj = null;
if (byt != null) {
obj = unserizlize(byt);
}
resultList.add(obj);
}
return resultList;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 移除count个object对象
* @param redisKey 标识符
*/
public static void delListObjects(String redisKey, Object object) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.lrem(redisKey.getBytes(), 1, serialize(object));
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 保留区域类的元素,其他的删除
* @param redisKey 标识符
* @param start 起始位置
* @param end 结束位置(-1)
*/
public static void holdListObjectsInRegion(String redisKey, long start, long end) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.ltrim(redisKey.getBytes(), start, end);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 返回List的长度
* @param redisKey redis标识符
* @return 长度 key不存在,返回 0
*/
public static long getListSize(String redisKey){
Jedis jedis = null;
try {
jedis = getJedis();
return jedis.llen(redisKey);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return 0l;
}
/**
* 存储Map集合
* @param redisKey 标识符(以“HASH-”开头)
* @param map 集合
* @param isCover 是否覆盖 true:新数据 false:旧数据+新数据
*/
public static void setHash(String redisKey, Map<String, Object> map,
boolean isCover) {
Jedis jedis = null;
try {
jedis = getJedis();
if (isCover) {
jedis.del(redisKey);
}
Map<byte[], byte[]> hash = new HashMap<byte[], byte[]>();
for (String mapKey : map.keySet()) {
Object object = map.get(mapKey);
byte[] byt = serialize(object);
hash.put(mapKey.getBytes(), byt);
}
jedis.hmset(redisKey.getBytes(), hash);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 添加某个键值对到缓存中
* @param redisKey 缓存的标识符
* @param mapKey map的标识符
* @param object 对象
*/
public static void addObjectToHash(String redisKey, String mapKey,
Object object) {
Jedis jedis = null;
try {
jedis = getJedis();
byte[] byt = serialize(object);
jedis.hset(redisKey.getBytes(), mapKey.getBytes(), byt);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 根据标识符获取Map集合
* @param redisKey 标识符
* @return map集合
*/
public static Map<String, Object> getHash(String redisKey) {
Jedis jedis = null;
try {
jedis = getJedis();
if (!exists(redisKey)) {
return null;
}
Map<String, Object> resultMap = new HashMap<String, Object>();
Map<byte[], byte[]> map = jedis.hgetAll(redisKey.getBytes());
for (byte[] byt : map.keySet()) {
String mapKey = new String(byt);
Object object = unserizlize(map.get(byt));
resultMap.put(mapKey, object);
}
return resultMap;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 根据标识符和集合的键获取存储的对象
* @param redisKey 标识符
* @param mapKey 集合的键
* @return map存储的对象
*/
public static Object getObjectByMapKey(String redisKey, String mapKey) {
Jedis jedis = null;
try {
jedis = getJedis();
if (!exists(redisKey)) {
return null;
}
List<byte[]> list = jedis.hmget(redisKey.getBytes(),
mapKey.getBytes());
if (list != null && list.size() > 0 && list.get(0) != null) {
byte[] byt = list.get(0);
Object object = unserizlize(byt);
return object;
}
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 删除标识符存储的map恐吓中一个或多个键值
* @param redisKey 标识符
* @param mapKey map集合的键
*/
public static void delMapByMapKey(String redisKey, String... mapKey) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.hdel(redisKey, mapKey);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 返回Map的长度
* @param redisKey redis标识符
* @return 长度 key不存在,返回 0
*/
public static long getMapSize(String redisKey){
Jedis jedis = null;
try {
jedis = getJedis();
return jedis.hlen(redisKey);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return 0l;
}
/**
* 设置数据过多久过期(以最后一次设置为准)
* @param redisKey redis标识符
* @param seconds 秒
*/
public static void setExpireTime(String redisKey,int seconds){
Jedis jedis = null;
try {
jedis = getJedis();
jedis.expire(redisKey, seconds);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 获取数据的过期时间
* @param redisKey redis标识符
* @return 秒 -1:没设置 -2:数据不存在
*/
public static Long getExpireTime(String redisKey){
Jedis jedis = null;
try {
jedis = getJedis();
Long time = jedis.ttl(redisKey);
return time;
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return null;
}
/**
* 判断标识符的是否存在
* @param redisKey 标识符
*/
public static boolean exists(String redisKey) {
Jedis jedis = null;
try {
jedis = getJedis();
return jedis.exists(redisKey);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
return false;
}
/**
* 删除某些标识符的存储的数据
* @param redisKey 标识符
*/
public static void del(String... redisKey) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.del(redisKey);
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 清空数据
*/
public static void flush() {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.flushDB();
} catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
} finally {
returnResource(jedis);
}
}
/**
* 释放资源
*/
public static void returnResource(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
/**
* 对象序列化成字节数组
* @param obj 对象(必须序列化,实现Serializable接口)
* @return 字节数组
*/
private static byte[] serialize(Object obj) {
ObjectOutputStream obi = null;
ByteArrayOutputStream bai = null;
try {
bai = new ByteArrayOutputStream();
obi = new ObjectOutputStream(bai);
obi.writeObject(obj);
byte[] byt = bai.toByteArray();
return byt;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 字节数组反序列化成对象
* @param byt 字节数组
* @return 对象(必须序列化,实现Serializable接口)
*/
private static Object unserizlize(byte[] byt) {
ObjectInputStream oii = null;
ByteArrayInputStream bis = null;
bis = new ByteArrayInputStream(byt);
try {
oii = new ObjectInputStream(bis);
Object obj = oii.readObject();
return obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws Exception {
List<Object> list = new ArrayList<Object>();
for (int i = 1; i < 10001; i++) {
TempData t = new TempData();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = sdf.parse("20180119210000");
date.setSeconds(i);
t.setCreateTime(date);
System.out.println(sdf.format(date));
t.setDataContent("temperature,20.00,"+sdf.format(date)
+";humidity,85.00,"+sdf.format(date)+";battery,12.67,"
+sdf.format(date)+";");
t.setDataId(168755);
t.setDataType(0);
t.setIecTriggerType("010000");
t.setLogicNodeCode("002_FILTH");
t.setMdeviceid(800010120001l);
t.setMobjectid(300020120003l);
t.setMtypeid(42027846);
list.add(t);
}
RedisUtil.setList("LIST-TEMPDATA-FILTH", list, true);
System.out.println("数量:"+RedisUtil.getListSize("LIST-TEMPDATA-FILTH"));
}
}