package com.cms.common;
import com.alibaba.fastjson.JSON;
import com.qiyi.tvguo.cms.common.utils.ObjectSerializeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* redis client
*/
@Component
@Slf4j
public class RedisClient {
private static JedisPool pool;
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private Integer port;
@Value("${redis.password}")
private String password;
private final int timeout=5000;
private final int database=0;
private final int maxConnection=500;
private final int maxIdle=50;
private final int minIdle=20;
@PostConstruct
public void init()
{
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(maxConnection);
config.setMaxIdle(maxIdle);
config.setMinIdle(minIdle);
config.setMaxWaitMillis(1000);
config.setTestOnBorrow(true);
pool = new JedisPool(config, host,port,timeout, password, database);
log.info("------jedis pool init------");
}
/**
* 获取jedis
* @return
*/
public Jedis getJedis()
{
return pool.getResource();
}
@PreDestroy
public void destroy()
{
if(pool==null)
{
return;
}
pool.destroy();
log.info("-----jedis pool destroy-----");
}
/**
* 复杂对象存入redis
* @param key
* @param v
* @param expireSeconds
* @param <T>
* @return
*/
public <T> Boolean setExByte(String key,T v,int expireSeconds)
{
Jedis jedis=null;
try
{
jedis= getJedis();
jedis.setex(key.getBytes(),expireSeconds,ObjectSerializeUtil.serialize(v));
return true;
}catch (Exception ex)
{
log.error("复杂对象存入redis异常:{}",ex);
}finally {
if(jedis!=null)
{
jedis.close();
}
}
return false;
}
/**
* 获取Value 为byte[]的复杂对象
* @param key
* @param <T>
* @return
*/
public <T> T getByteObject(String key)
{
Jedis jedis=null;
try
{
jedis= getJedis();
byte[] bytes= jedis.get(key.getBytes());
return (T)ObjectSerializeUtil.unserizlize(bytes);
}catch (Exception ex)
{
log.error("redis获取复杂对象异常:{}",ex);
}finally {
if(jedis!=null)
{
jedis.close();
}
}
return null;
}
/**
* 对象以JSON存入redis
* @param key
* @param obj
* @param expireSeconds
* @param <T>
* @return
*/
public <T> Boolean setExJson(String key,T obj,int expireSeconds)
{
Jedis jedis=null;
try
{
jedis= getJedis();
jedis.setex(key,expireSeconds, JSON.toJSONString(obj));
return true;
}catch (Exception ex)
{
log.error("复杂对象存入redis异常:{}",ex);
}finally {
if(jedis!=null)
{
jedis.close();
}
}
return false;
}
/**
* 获取Value 为Json的复杂对象
* @param key
* @param <T>
* @return
*/
public <T extends Object> T getJsonObject(String key,Class<T> clazz)
{
Jedis jedis=null;
try
{
jedis= getJedis();
String jsonString= jedis.get(key);
return JSON.parseObject(jsonString, clazz);
}catch (RuntimeException ex)
{
log.error("redis获取Json复杂对象异常:{}",ex);
} finally {
if(jedis!=null)
{
jedis.close();
}
}
return null;
}
}
package com.common.utils;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
@Slf4j
public class ObjectSerializeUtil implements Serializable {
/**
* 序列化对象
* @param obj
* @param <T> T 必须实现Serializable接口,
* T 中尽量加上 serialVersionUID (private static final long serialVersionUID)
* @return
*/
public static <T> byte [] serialize(T obj){
ObjectOutputStream outputStream;
ByteArrayOutputStream byteArrayOutputStream;
try {
byteArrayOutputStream=new ByteArrayOutputStream();
outputStream=new ObjectOutputStream(byteArrayOutputStream);
outputStream.writeObject(obj);
byte[] byteArray=byteArrayOutputStream.toByteArray();
return byteArray;
} catch (IOException e) {
log.error("ObjectSerializeUtil-IOException:{}",e);
}
return null;
}
/**反序列化对象
* @param byteArray
* @param <T>T 必须实现Serializable接口,
* * T 中尽量加上 serialVersionUID (private static final long serialVersionUID)
* @return
*/
public static <T> Object unserizlize(byte[] byteArray){
ObjectInputStream inputStream;
ByteArrayInputStream byteArrayInputStream;
byteArrayInputStream=new ByteArrayInputStream(byteArray);
try {
inputStream=new ObjectInputStream(byteArrayInputStream);
T obj=(T)inputStream.readObject();
return obj;
} catch (Exception e) {
log.error("ObjectSerializeUtil-IOException:{}",e);
}
return null;
}
}