在开发中,领导们可能觉得哪个页面的数据查的太慢了,影响客户的体验,需要进行优化,怎么优化呢,那当然是使用redis缓存了!!!
在使用redis时,也是需要知道redis有哪些类型,在这种需求下,想到的类型只有两种,list和map,这次以list为例,兄弟们,奥利给!!!
首先,需要定义一个redis工具类(redisUtils)
package com.deloitte.crm.utils;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/*redis工具类*/
@Component
public class RedisUtils {
private static String ip = "localhost";
private static int port = 6379;
private static int timeout = 10000;
private static JedisPool pool = null;
static {
JedisPoolConfig config = new JedisPoolConfig();
//设置最大空闲数
config.setMaxIdle(200);
//设置最大连接数
config.setMaxTotal(1024);
//等待池连接最长时间
config.setMaxWaitMillis(10000);
//是否提前validate操作
config.setTestOnBorrow(true);
pool = new JedisPool(config,ip,port,timeout);
}
//得到redis连接
public static Jedis getJedis(){
if (pool == null){
return null;
}
return pool.getResource();
}
//关闭redis连接
public static void close(Jedis redis){
if (redis != null){
redis.close();
}
}
}
这里的关闭redis连接,一般都是redis.close(),但是,我在使用close的时候,发现IOUtils包下有一个close(Closeable x)方法,很好用,哈哈哈哈,有大佬看到可以帮忙讲解一下原理。
其次,在对list类型的数据存取到redis时,一般都是需要进行序列化的。
package com.deloitte.crm.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import static com.alibaba.fastjson.util.IOUtils.close;
public class SerializableUtilsList {
/*序列化list集合*/
public static byte[] serializeList(List<?> list){
if (list == null || list.size() == 0){
return null;
}
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
byte[] bytes = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
for (Object o : list){
oos.writeObject(o);
}
bytes = baos.toByteArray();
}catch (Exception e){
e.printStackTrace();
}finally {
close(oos);
close(baos);
}
return bytes;
}
/*反序列化list集合*/
public static List<?> unSerializeList(byte[] bytes){
if (bytes == null){
return null;
}
List<Object> list = new ArrayList<>();
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais);
/*剩余可读字节数*/
while (bais.available() > 0){
Object object = ois.readObject();
if (object == null){
break;
}
list.add(object);
}
}catch (Exception e){
e.printStackTrace();
}finally {
close(bais);
close(ois);
}
return list;
}
}
这里我也是引用某些大佬,如果大佬看见了,麻烦说一下,俺去请教一下!具体内容应该是利用字节数组输出流和字节数组输入流等等去做序列化和反序列化的操作。(能力有限,没办法)
最后,在封装一个存取list集合的类就可以啦!
package com.deloitte.crm.utils;
import redis.clients.jedis.Jedis;
import java.util.List;
public class DataList {
/*存储过期时间*/
private static final long EXPIRE_TIME = 60 * 60 * 24;
/*存储list集合*/
public static void setList(String key, List<?> value){
Jedis jedis = RedisUtils.getJedis();
try {
if (value == null || value.size() == 0){
jedis.set(key.getBytes(),"".getBytes());
}
jedis.set(key.getBytes(),SerializableUtilsList.serializeList(value));
}catch (Exception e){
e.printStackTrace();
}finally {
jedis.close();
}
}
/*取出list集合*/
public static List<?> getList(String key){
Jedis jedis = RedisUtils.getJedis();
if (jedis == null || !jedis.exists(key)){
return null;
}
byte[] data = jedis.get(key.getBytes());
jedis.close();
return SerializableUtilsList.unSerializeList(data);
}
}
这里的过期时间,我到现在都不明白怎么放进去,如果有知道的,麻烦留言告知一下,我改进改进!谢谢啦!
接下来,就是你在业务代码中加入啦,提醒一下各位兄弟们,如果是条件查询,key值的话是可以进行自定义处理的哦,就是说前端传什么条件就查出该条件的数据。
(貌似可以用aop去做,我不会!!!!!!!!)
祝各位兄弟们在开发中无bug,整天摸鱼!