中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot怎么整合Redis實現序列化存儲Java對象

發布時間:2023-03-23 11:54:21 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

今天小編給大家分享一下SpringBoot怎么整合Redis實現序列化存儲Java對象的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、背景

1、思考

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

2、方案

我們可以將 Java 對象轉化為 JSON 對象,然后轉為 JSON 字符串,存入 Redis,那么我們從 Redis 中取出該數據的時候,我們也只能取出字符串,并轉為 Java 對象,這一系列的操作是不是顯得有些麻煩呢?

二、源碼分析

SpringBoot怎么整合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、測試結果

SpringBoot怎么整合Redis實現序列化存儲Java對象

可以看出,我們往 Redis 中成功存入 Java 對象數據,并成功獲取到了該對象。

以上就是“SpringBoot怎么整合Redis實現序列化存儲Java對象”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

峨山| 金川县| 稻城县| 永吉县| 塔河县| 涿鹿县| 霸州市| 安西县| 中卫市| 庐江县| 中西区| 广德县| 迭部县| 葫芦岛市| 祁连县| 常熟市| 鹤峰县| 民丰县| 鄂伦春自治旗| 利津县| 雅安市| 古丈县| 防城港市| 札达县| 江津市| 仙桃市| 应城市| 河南省| 芮城县| 林芝县| 长岛县| 乌恰县| 新兴县| 阿克| 施秉县| 太仓市| 邻水| 扶余县| 和田县| 石台县| 聊城市|