首頁 > 軟體

SpringBoot整合Redis實現序列化儲存Java物件的操作方法

2023-03-23 22:05:38

之前介紹過 https://www.jb51.net/article/223539.htm 我們可以看出,在 SpringBoot 對 Redis 做了一系列的自動裝配,使用還是非常方便的

一、背景

1、思考

通過我們前面的學習,我們已經可以往 Redis 中存入字串,那麼我們要往 Redis 中存入 Java 物件該怎麼辦呢?

2、方案

我們可以將 Java 物件轉化為 JSON 物件,然後轉為 JSON 字串,存入 Redis,那麼我們從 Redis 中取出該資料的時候,我們也只能取出字串,並轉為 Java 物件,這一系列的操作是不是顯得有些麻煩呢?

二、原始碼分析

  • 以上是 RedisAutoConfiguration 類中的原始碼片段,可以看出 SpringBoot 對 Redis 做自動化設定的時候,在容器中注入了 redisTemplate 和 stringRedisTemplate
  • 其中,RedisTemplate<Object, Object> 表示,key 的型別為 Object,value 的型別為 Object,但是我們往往需要的是 RedisTemplate<String, Object>,這就需要我們重新注入一個 RedisTemplate 的 Bean,它的泛型為 RedisTemplate<String, Object>,並設定 key,value 的序列化方式
  • 看到這個@ConditionalOnMissingBean註解後,就知道如果Spring容器中有了RedisTemplate物件了,這個自動設定的RedisTemplate不會範例化。因此我們可以直接自己寫個設定類,設定RedisTemplate。

三、注入RedisTemplate

1、引入依賴

<!-- redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

以上引入了 redis 的依賴,其餘依賴請自行新增

2、Redis 連線資訊

spring:
  # Redis設定
  redis:
    host: 127.0.0.1
    port: 6379
    database: 10
    jedis:
      pool:
        # 連線池最大連線數(使用負值表示沒有限制)
        max-active: 50
        # 連線池最大阻塞等待時間(使用負值表示沒有限制)
        max-wait: 3000ms
        # 連線池中的最大空閒連線數
        max-idle: 20
        # 連線池中的最小空閒連線數
        min-idle: 5
    # 連線超時時間(毫秒)
    timeout: 5000ms

3、Redis 核心設定類

Redis 的核心設定我們放在 RedisConfig.java 檔案中

package com.zyxx.redistest.common;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @ClassName RedisConfig
 * @Description
 * @Author Lizhou
 * @Date 2020-10-22 9:48:48
 **/

@Configuration
public class RedisConfig {

    /**
     * RedisTemplate設定
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
		// 設定redisTemplate
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 設定序列化
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value序列化
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // Hash key序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // Hash value序列化
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

我們注入了一個名稱為 redisTemplate,型別為 RedisTemplate<String, Object> 的 Bean,key 採用 StringRedisSerializer 序列化方式,value 採用 Jackson2JsonRedisSerializer 序列化方式

4、Redis工具類

我們將對 Redis 進行的一系列操作放在 RedisUtils.java 檔案中

package com.zyxx.redistest.common;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @ClassName RedisUtils
 * @Description
 * @Author Lizhou
 * @Date 2020-10-22 10:10:10
 **/
@Slf4j
@Component
public class RedisUtils {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 根據key讀取資料
     */
    public Object get(final String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        try {
            return redisTemplate.opsForValue().get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 寫入資料
     */
    public boolean set(final String key, Object value) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        try {
            redisTemplate.opsForValue().set(key, value);
            log.info("存入redis成功,key:{},value:{}", key, value);
            return true;
        } catch (Exception e) {
            log.error("存入redis失敗,key:{},value:{}", key, value);
            e.printStackTrace();
        }
        return false;
    }
}

我們寫入了 get,set 兩個方法用於測試

四、測試

1、建立 Java 實體類 UserInfo

package com.zyxx.redistest.common;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @ClassName UserInfo
 * @Description
 * @Author Lizhou
 * @Date 2020-10-22 10:12:12
 **/
@Data
public class UserInfo implements Serializable {
    /**
     * id
     */
    private Integer id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 建立時間
     */
    private Date createTime;
}

2、測試用例

package com.zyxx.redistest;

import com.zyxx.redistest.common.RedisUtils;
import com.zyxx.redistest.common.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
class RedisTestApplicationTests {

    @Autowired
    private RedisUtils redisUtil;

    @Test
    void contextLoads() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setName("jack");
        userInfo.setCreateTime(new Date());
        // 放入redis
        redisUtil.set("user", userInfo);
        // 從redis中獲取
		System.out.println("獲取到資料:" + redisUtil.get("user"));
    }
}

我們向 Redis 中存入了一個 key 為 ”user“,value 為 UserInfo 物件的資料,然後再根據 key 獲取該資料

3、測試結果

可以看出,我們往 Redis 中成功存入 Java 物件資料,併成功獲取到了該物件

到此這篇關於SpringBoot整合Redis實現序列化儲存Java物件的文章就介紹到這了,更多相關SpringBoot整合Redis序列化儲存Java物件內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com