springboot 整合 redis 解决序列化并设置过期时间

  • springboot整合redis教程https://www.jianshu.com/p/fd65156ff630,由此教程无法设置失效时间,需要进行优化
  • springboot 自带的 redisTemplate.opsForValue().set() 用来设置键,有四个参数,分别是 key value 失效时间 失效时间格式(分、秒啥的,在idea环境下有提示),但是原生的 redis 操作无法序列化数据,也就是说存入的数据是乱码的,这时我们就用到上面那个教程,改用教程里的redis操作,但是教程redis操作方法只有两个参数,一个key一个value,无法进行失效时间设置,所以需要进行优化
  • 进入原生的 redis 操作 redisTemplate.opsForValue().set() 方法里,可以看到有是是三个重载方法
    在这里插入图片描述
    在教程里的是这样的

在这里插入图片描述

这个教程里的方法只接受两个参数,序列化后调用原生redis操作,所以我们需要在下面加上四个参数的方法以形成重载。由于教程作者封装好了可以序列化所有数据的方法, 所以我们要重载作者的set方法
在这里插入图片描述

设置好以后就可以用了,例如下面

在这里插入图片描述

上面的 redisTempleService 是教程里作者封装好了可以序列化任意数据的 service,所以我们设置了key,并传入一个对象,设置时间,设置时间格式,这种存方法完美解决一切问题,不会乱码,json格式也可以直接存入(存入对象即成为json),而下面的是 springboot 原生方法,存在着很多问题,所以还是用现有的轮子比较好。

改过后的代码

package com.server.vue.service;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class RedisTempleService {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    public <T> boolean set(String key ,T value){
        try {
            //任意类型转换成String
            String val = beanToString(value);
            if(val==null||val.length()<=0){
                return false;
            }
            stringRedisTemplate.opsForValue().set(key,val);
            return true;
        }catch (Exception e){
            return false;
        }
    }
    public <T> T get(String key,Class<T> clazz){
        try {
            String value = stringRedisTemplate.opsForValue().get(key);

            return stringToBean(value,clazz);
        }catch (Exception e){
            return null ;
        }
    }

    @SuppressWarnings("unchecked")
    private <T> T stringToBean(String value, Class<T> clazz) {
        if(value==null||value.length()<=0||clazz==null){
            return null;
        }

        if(clazz ==int.class ||clazz==Integer.class){
            return (T)Integer.valueOf(value);
        }
        else if(clazz==long.class||clazz==Long.class){
            return (T)Long.valueOf(value);
        }
        else if(clazz==String.class){
            return (T)value;
        }else {
            return JSON.toJavaObject(JSON.parseObject(value),clazz);
        }
    }

    /**
     *
     * @param Every T values
     * @param T 任意类型
     * @return String
     */
    private <T> String beanToString(T value) {

        if(value==null){
            return null;
        }
        Class <?> clazz = value.getClass();
        if(clazz==int.class||clazz==Integer.class){
            return ""+value;
        }
        else if(clazz==long.class||clazz==Long.class){
            return ""+value;
        }
        else if(clazz==String.class){
            return (String)value;
        }else {
            return JSON.toJSONString(value);
        }
    }

    /*重载,使之可以设置过期时间*/
    public <T> boolean set(String key ,T value,long var3, TimeUnit var5){
        try {
            //任意类型转换成String
            String val = beanToString(value);
            if(val==null||val.length()<=0){
                return false;
            }
            stringRedisTemplate.opsForValue().set(key,val,var3,var5);
            return true;
        }catch (Exception e){
            return false;
        }
    }

}
发布了29 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42568510/article/details/98903747
今日推荐