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;
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章