将条件查询出的数据存储到redis中,并下次查询查询redis的缓存数据

在开发中,领导们可能觉得哪个页面的数据查的太慢了,影响客户的体验,需要进行优化,怎么优化呢,那当然是使用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,整天摸鱼!

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值