最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Redis實現(xiàn)序列化存儲Java對象的操作方法

 更新時間:2023年03月23日 10:29:17   作者:Asurplus  
這篇文章主要介紹了SpringBoot整合Redis實現(xiàn)序列化存儲Java對象,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

一、背景

1、思考

通過我們前面的學(xué)習(xí),我們已經(jīng)可以往 Redis 中存入字符串,那么我們要往 Redis 中存入 Java 對象該怎么辦呢?

2、方案

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

二、源碼分析

RedisAutoConfiguration

  • 以上是 RedisAutoConfiguration 類中的源碼片段,可以看出 SpringBoot 對 Redis 做自動化配置的時候,在容器中注入了 redisTemplate 和 stringRedisTemplate
  • 其中,RedisTemplate<Object, Object> 表示,key 的類型為 Object,value 的類型為 Object,但是我們往往需要的是 RedisTemplate<String, Object>,這就需要我們重新注入一個 RedisTemplate 的 Bean,它的泛型為 RedisTemplate<String, Object>,并設(shè)置 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:
        # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
        max-active: 50
        # 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)
        max-wait: 3000ms
        # 連接池中的最大空閑連接數(shù)
        max-idle: 20
        # 連接池中的最小空閑連接數(shù)
        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);
        // 設(shè)置序列化
        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 進(jìn)行的一系列操作放在 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;

    /**
     * 根據(jù)key讀取數(shù)據(jù)
     */
    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;
    }

    /**
     * 寫入數(shù)據(jù)
     */
    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、創(chuàng)建 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;
    /**
     * 創(chuàng)建時間
     */
    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("獲取到數(shù)據(jù):" + redisUtil.get("user"));
    }
}

我們向 Redis 中存入了一個 key 為 ”user“,value 為 UserInfo 對象的數(shù)據(jù),然后再根據(jù) key 獲取該數(shù)據(jù)

3、測試結(jié)果

測試結(jié)果

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

到此這篇關(guān)于SpringBoot整合Redis實現(xiàn)序列化存儲Java對象的文章就介紹到這了,更多相關(guān)SpringBoot整合Redis序列化存儲Java對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Windows下Redis的安裝使用教程

    Windows下Redis的安裝使用教程

    這篇文章主要以圖文結(jié)合的方式為大家詳細(xì)介紹了Windows下Redis的安裝使用,Redis的出現(xiàn),很大程度補(bǔ)償了memcached這類key/value存儲的不足,在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用,對Redis感興趣的小伙伴們可以參考一下
    2016-05-05
  • Redis Key的數(shù)量上限及優(yōu)化策略分享

    Redis Key的數(shù)量上限及優(yōu)化策略分享

    Redis 作為高性能的鍵值存儲數(shù)據(jù)庫,廣泛應(yīng)用于緩存、會話存儲、排行榜等場景,但在實際使用中,開發(fā)者常常會關(guān)心一個問題:Redis 的 Key 數(shù)量是否有上限?本文將從 Redis Key 的理論上限 出發(fā),深入探討 Redis Key 的管理策略,需要的朋友可以參考下
    2025-03-03
  • Redis高性能的原因及說明

    Redis高性能的原因及說明

    這篇文章主要介紹了Redis高性能的原因及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 淺析Redis如何保證數(shù)據(jù)不丟失

    淺析Redis如何保證數(shù)據(jù)不丟失

    Redis是一種Nosql類型的數(shù)據(jù)存儲,全稱Remote?Dictionary?Server,也就是遠(yuǎn)程字典服務(wù)器,本文主要來和大家討論一下Redis如何保證數(shù)據(jù)不丟失,需要的可以參考下
    2024-02-02
  • Redis Template實現(xiàn)分布式鎖的實例代碼

    Redis Template實現(xiàn)分布式鎖的實例代碼

    使用Redis的SETNX命令獲取分布式鎖的步驟,接下來通過本文給大家介紹Redis Template實現(xiàn)分布式鎖的實例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-09-09
  • redis3.2配置文件redis.conf詳細(xì)說明

    redis3.2配置文件redis.conf詳細(xì)說明

    redis3.2配置詳解,Redis啟動的時候,可以指定配置文件,詳細(xì)說明請看本文說明
    2018-03-03
  • redis的hGetAll函數(shù)的性能問題(記Redis那坑人的HGETALL)

    redis的hGetAll函數(shù)的性能問題(記Redis那坑人的HGETALL)

    這篇文章主要介紹了redis的hGetAll函數(shù)的性能問題,需要的朋友可以參考下
    2016-02-02
  • 一文詳解如何使用Redis實現(xiàn)分布式鎖

    一文詳解如何使用Redis實現(xiàn)分布式鎖

    這篇文章主要介紹了一文詳解如何使用Redis實現(xiàn)分布式鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Redis客戶端及服務(wù)端的安裝教程詳解

    Redis客戶端及服務(wù)端的安裝教程詳解

    這篇文章主要介紹了Redis客戶端及服務(wù)端的安裝教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 一文掌握Redis的三種集群方案(小結(jié))

    一文掌握Redis的三種集群方案(小結(jié))

    這篇文章主要介紹了一文掌握Redis的三種集群方案(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

舞阳县| 宁化县| 宝山区| 璧山县| 南木林县| 射阳县| 黄石市| 雅江县| 堆龙德庆县| 湘潭县| 石台县| 崇明县| 乌拉特后旗| 邵武市| 井冈山市| 惠州市| 竹溪县| 固阳县| 崇明县| 彝良县| 安徽省| 敦煌市| 永州市| 蛟河市| 新源县| 正安县| 饶河县| 南部县| 武平县| 营山县| 邢台市| 中江县| 介休市| 临湘市| 亚东县| 上杭县| 麻江县| 军事| 巨野县| 抚顺市| 东乡县|