package com.zt.portal.commons;
import com.zt.aide.CollectionAide;
import com.zt.aide.JsonAide;
import com.google.gson.reflect.TypeToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/*** TODO zhangtao RedisExpiredCache** @author zhangtao* @since 2018-07-27 下午3:02*/
@Component("redisExpiredCache")
public class RedisExpiredCache {
/** 默认的缓存数据保持时间,毫秒 **/
private static final long DEFAULT_HOLD_TIME = 20000;
private final StringRedisTemplate exportRedis;
@Autowired
public RedisExpiredCache(StringRedisTemplate exportRedis) {
this.exportRedis = exportRedis;
}
public void put(String key, T value) {
exportRedis.opsForValue().set(key, JsonAide.toJson(value), DEFAULT_HOLD_TIME, TimeUnit.MILLISECONDS);
}
public T getObject(String key, Class clazz) {
String json = exportRedis.opsForValue().get(key);
return JsonAide.fromJson(json, clazz);
}
public void put(String key, List value) {
exportRedis.execute(new RedisCallback() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
RedisSerializer serializer = exportRedis.getStringSerializer();
for(int i = 0; i < value.size() ; i++) {
try {
connection.set(serializer.serialize(key + i), serializer.serialize(JsonAide.toJson(value.get(i))));
connection.pExpire(serializer.serialize(key + i), DEFAULT_HOLD_TIME);
} catch (Exception e) {
e.printStackTrace();
}
}
return connection.closePipeline();
}
});
}
public List getList(String key, Class clazz) {
RedisSerializer serializer = exportRedis.getStringSerializer();
List list = CollectionAide.newArrayList();
Set keys = exportRedis.keys(key + "*");
RedisCallback callback = new RedisCallback() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
for(int i = 0; i < keys.size(); i++) {
try {
connection.get(serializer.serialize(key + i));
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
};
List result = exportRedis.executePipelined(callback);
for(Object object : result) {
list.add(JsonAide.fromJson(object.toString(), clazz));
}
return list;
}
}