亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
1、自訂RedisTemplate
1.1、Redis API預設序列化機制
2.2、自定義RedisCacheManager
首頁 資料庫 Redis SpringBoot怎麼自訂Redis實作快取序列化

SpringBoot怎麼自訂Redis實作快取序列化

Jun 03, 2023 am 11:32 AM
redis springboot

1、自訂RedisTemplate

1.1、Redis API預設序列化機制

基於API的Redis快取實作是使用RedisTemplate模板進行資料快取操作的,這裡開啟RedisTemplate類,查看該類別的原始碼資訊

public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
    // 聲明了key、value的各種序列化方式,初始值為空
    @Nullable
    private RedisSerializer keySerializer = null;
    @Nullable
    private RedisSerializer valueSerializer = null;
    @Nullable
    private RedisSerializer hashKeySerializer = null;
    @Nullable
    private RedisSerializer hashValueSerializer = null;
...
    // 進行默認序列化方式設置,設置為JDK序列化方式
    public void afterPropertiesSet() {
        super.afterPropertiesSet();
        boolean defaultUsed = false;
        if (this.defaultSerializer == null) {
            this.defaultSerializer = new JdkSerializationRedisSerializer(
                    this.classLoader != null ?
                            this.classLoader : this.getClass().getClassLoader());
        }
        ...
    }
        ...
}

從上述RedisTemplate核心原始碼可以看出,在RedisTemplate內(nèi)部宣告了快取資料key、value的各種序列化方式,且初始值都為空;在afterPropertiesSet()方法中,判斷如果預設序列化參數(shù)defaultSerializer為空,將資料的預設序列化方式設定為JdkSerializationRedisSerializer

根據(jù)上述原始碼資訊的分析,可以得到以下兩個重要的結(jié)論:

# (1)使用RedisTemplate進行Redis數(shù)據(jù)緩存操作時,內(nèi)部默認使用的是JdkSerializationRedisSerializer序列化方式,所以進行數(shù)據(jù)緩存的實體類必須實現(xiàn)JDK自帶的序列化接口(例如Serializable);

( 2)使用RedisTemplate進行Redis資料快取操作時,如果自訂了快取序列化方式defaultSerializer,那麼就會使用自訂的序列化方式。

另外,在RedisTemplate類別原始碼中,看到的快取資料key、value的各種序列化類型都是RedisSerializer。進入RedisSerializer原始碼查看RedisSerializer支援的序列化方式(進入該類別後,使用Ctrl Alt 左鍵單擊類別名稱查看)

SpringBoot怎麼自訂Redis實作快取序列化

##可以看出,RedisSerializer是一個Redis序列化接口,預設有6個實現(xiàn)類,這6個實現(xiàn)類代表了6種不同的資料序列化方式。其中,JdkSerializationRedisSerializer是JDK自帶的,也是RedisTemplate內(nèi)部預設使用的資料序列化方式,開發(fā)者可以根據(jù)需要選擇其他支援的序列化方式(例如JSON方式)

1.2、自訂RedisTemplate序列化機制

在專案中引入Redis相依性後,Spring Boot提供的RedisAutoConfiguration自動設定會生效。開啟RedisAutoConfiguration類,查看內(nèi)部原始碼中關於RedisTemplate的定義方式

public class RedisAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean(
            name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
...
}

從上述RedisAutoConfiguration核心原始碼中可以看出,在Redis自動配置類別中,透過Redis連接工廠RedisConnectionFactory初始化了一個RedisTemplate;該類別上方新增了@ConditionalOnMissingBean註解(顧名思義,當某個Bean不存在時生效),用來表示如果開發(fā)者自訂了一個名為redisTemplate的Bean,則該預設初始化的RedisTemplate不會生效。

如果想要使用自訂序列化方式的RedisTemplate進行資料快取操作,可以參考上述核心程式碼建立一個名為redisTemplate的Bean元件,並在該元件中設定對應的序列化方式即可

接下來,在專案中建立名為com.lagou.config的套件,在該套件下建立一個Redis自訂設定類別RedisConfig,並依照上述思路自訂名為redisTemplate的Bean元件

@Configuration
public class RedisConfig {
    // 自定義RedisTemplate
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        // 創(chuàng)建一個JSON格式序列化對象,對緩存數(shù)據(jù)的key和value進行轉(zhuǎn)換
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        // 解決查詢緩存轉(zhuǎn)換異常的問題
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 設置RedisTemplate模板api序列化方式為json
        template.setDefaultSerializer(jackson2JsonRedisSerializer);
        return template;
    }
}

透過@Configuration註解定義了一個RedisConfig配置類,並使用@Bean註解注入了一個預設名稱為方法名的redisTemplate元件(注意,該Bean元件名稱必須是redisTemplate)。在定義的Bean元件中,自訂了一個RedisTemplate,使用自訂的Jackson2JsonRedisSerializer資料序列化方式;在自訂序列化方式中,定義了一個ObjectMapper用於進行資料轉(zhuǎn)換設定

#1.3、效果測試

SpringBoot怎麼自訂Redis實作快取序列化

可以看出,執(zhí)行findById()方法正確查詢出使用者評論資訊Comment,重複進行同樣的查詢操作,資料庫只執(zhí)行了一次SQL語句,這說明定制的Redis快取生效。

使用Redis用戶端視覺化管理工具Redis Desktop Manager查看快取資料:

SpringBoot怎麼自訂Redis實作快取序列化

執(zhí)行findById()方法查詢出使用者評論資訊Comment正確儲存到了Redis在快取庫中,且快取到Redis服務的資料已經(jīng)使用了JSON格式儲存展示,檢視和管理也非常方便,說明自訂的Redis API範本工具RedisTemplate生效

2、自訂RedisCacheManager

剛剛針對基於API方式的RedisTemplate進行了自訂序列化方式的改進,從而實現(xiàn)了JSON序列化方式緩存數(shù)據(jù),但是這種自定義的RedisTemplate對於基於註解的Redis緩存來說,是沒有作用的。

接下來,針對基於註解的Redis快取機制和自訂序列化方式進行解說

2.1、Redis註解預設序列化機制

開啟Spring Boot整合Redis元件提供的快取自動配置類別RedisCacheConfiguration(org.springframework.boot.autoconfigure.cache套件下的),查看該類別的原始碼訊息,其核心程式碼如下

@Configuration
class RedisCacheConfiguration {
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
        RedisCacheManagerBuilder builder = RedisCacheManager
                .builder(redisConnectionFactory)
                .cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader()));
        List<String> cacheNames = this.cacheProperties.getCacheNames();
        if (!cacheNames.isEmpty()) {
            builder.initialCacheNames(new LinkedHashSet(cacheNames));
        }
        return (RedisCacheManager) this.customizerInvoker.customize(builder.build());
    }
    private org.springframework.data.redis.cache.RedisCacheConfiguration
    determineConfiguration(ClassLoader classLoader) {
        if (this.redisCacheConfiguration != null) {
            return this.redisCacheConfiguration;
        } else {
            Redis redisProperties = this.cacheProperties.getRedis();
            org.springframework.data.redis.cache.RedisCacheConfiguration config = org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig();
            config = config.serializeValuesWith(SerializationPair.fromSerializer(
                            new JdkSerializationRedisSerializer(classLoader)));
            ...
            return config;
        }
    }
}

從上述核心源碼中可以看出,同RedisTemplate核心源碼類似,RedisCacheConfiguration內(nèi)部同樣通過Redis連接工廠RedisConnectionFactory定義了一個緩存管理器RedisCacheManager;同時定制RedisCacheManager時,也默認使用了JdkSerializationRedisSerializer序列化方式。

如果想要使用自定義序列化方式的RedisCacheManager進行數(shù)據(jù)緩存操作,可以參考上述核心代碼創(chuàng)建一個名為cacheManager的Bean組件,并在該組件中設置對應的序列化方式即可

在Spring Boot 2.X版本中,RedisCacheManager是獨立構建的。因此,在SpringBoot 2.X版本中,對RedisTemplate進行自定義序列化機制構建后,仍然無法對RedisCacheManager內(nèi)部默認序列化機制進行覆蓋(這也就解釋了基 于注解的Redis緩存實現(xiàn)仍然會使用JDK默認序列化機制的原因),想要基于注解的Redis緩存實現(xiàn)也使用自定義序列化機制,需要自定義RedisCacheManager

2.2、自定義RedisCacheManager

在項目的Redis配置類RedisConfig中,按照上一步分析的定制方法自定義名為cacheManager的Bean組件

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 分別創(chuàng)建String和JSON格式序列化對象,對緩存數(shù)據(jù)key和value進行轉(zhuǎn)換
        RedisSerializer<String> strSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jacksonSerial = new Jackson2JsonRedisSerializer(Object.class);
        // 解決查詢緩存轉(zhuǎn)換異常的問題
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); // 上面注釋過時代碼的替代方法
        jacksonSerial.setObjectMapper(om);
        // 定制緩存數(shù)據(jù)序列化方式及時效
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(1)) // 設置緩存數(shù)據(jù)的時效(設置為了1天)
                .serializeKeysWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(strSerializer)) // 對當前對象的key使用strSerializer這個序列化對象,進行轉(zhuǎn)換
                .serializeValuesWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(jacksonSerial)) // 對value使用jacksonSerial這個序列化對象,進行轉(zhuǎn)換
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager
                .builder(redisConnectionFactory).cacheDefaults(config).build();
        return cacheManager;
    }

上述代碼中,在RedisConfig配置類中使用@Bean注解注入了一個默認名稱為方法名的cacheManager組件。在定義的Bean組件中,通過RedisCacheConfiguration對緩存數(shù)據(jù)的key和value分別進行了序列化方式的定制,其中緩存數(shù)據(jù)的key定制為StringRedisSerializer(即String格式),而value定制為了Jackson2JsonRedisSerializer(即JSON格式),同時還使用entryTtl(Duration.ofDays(1))方法將緩存數(shù)據(jù)有效期設置為1天

完成基于注解的Redis緩存管理器RedisCacheManager定制后,可以對該緩存管理器的效果進行測試(使用自定義序列化機制的RedisCacheManager測試時,實體類可以不用實現(xiàn)序列化接口)

以上是SpringBoot怎麼自訂Redis實作快取序列化的詳細內(nèi)容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
Laravel 最佳擴展包推薦:2024 年必備工具 Laravel 最佳擴展包推薦:2024 年必備工具 Apr 30, 2025 pm 02:18 PM

2024年必備的Laravel擴展包包括:1.LaravelDebugbar,用於監(jiān)控和調(diào)試代碼;2.LaravelTelescope,提供詳細的應用監(jiān)控;3.LaravelHorizon,管理Redis隊列任務。這些擴展包能提升開發(fā)效率和應用性能。

Laravel 環(huán)境搭建與基礎配置(Windows/Mac/Linux) Laravel 環(huán)境搭建與基礎配置(Windows/Mac/Linux) Apr 30, 2025 pm 02:27 PM

在不同操作系統(tǒng)上搭建Laravel環(huán)境的步驟如下:1.Windows:使用XAMPP安裝PHP和Composer,配置環(huán)境變量,安裝Laravel。 2.Mac:使用Homebrew安裝PHP和Composer,安裝Laravel。 3.Linux:使用Ubuntu更新系統(tǒng),安裝PHP和Composer,安裝Laravel。每個系統(tǒng)的具體命令和路徑有所不同,但核心步驟一致,確保順利搭建Laravel開發(fā)環(huán)境。

REDIS:與傳統(tǒng)數(shù)據(jù)庫服務器的比較 REDIS:與傳統(tǒng)數(shù)據(jù)庫服務器的比較 May 07, 2025 am 12:09 AM

Redis在高並發(fā)和低延遲場景下優(yōu)於傳統(tǒng)數(shù)據(jù)庫,但不適合複雜查詢和事務處理。 1.Redis使用內(nèi)存存儲,讀寫速度快,適合高並發(fā)和低延遲需求。 2.傳統(tǒng)數(shù)據(jù)庫基於磁盤,支持複雜查詢和事務處理,數(shù)據(jù)一致性和持久性強。 3.Redis適用於作為傳統(tǒng)數(shù)據(jù)庫的補充或替代,但需根據(jù)具體業(yè)務需求選擇。

linux如何限制用戶資源? ulimit怎麼配置? linux如何限制用戶資源? ulimit怎麼配置? May 29, 2025 pm 11:09 PM

Linux系統(tǒng)通過ulimit命令限制用戶資源,防止資源過度佔用。 1.ulimit是shell內(nèi)置命令,可限製文件描述符數(shù)(-n)、內(nèi)存大小(-v)、線程數(shù)(-u)等,分為軟限制(當前生效值)和硬限制(最高上限)。 2.臨時修改直接使用ulimit命令,如ulimit-n2048,但僅對當前會話有效。 3.永久生效需修改/etc/security/limits.conf及PAM配置文件,並添加sessionrequiredpam_limits.so。 4.systemd服務需在unit文件中設置Lim

Redis主要是數(shù)據(jù)庫嗎? Redis主要是數(shù)據(jù)庫嗎? May 05, 2025 am 12:07 AM

Redis主要是一個數(shù)據(jù)庫,但它不僅僅是數(shù)據(jù)庫。 1.作為數(shù)據(jù)庫,Redis支持持久化,適合高性能需求。 2.作為緩存,Redis提升應用響應速度。 3.作為消息代理,Redis支持發(fā)布-訂閱模式,適用於實時通信。

REDIS:超越SQL- NOSQL的觀點 REDIS:超越SQL- NOSQL的觀點 May 08, 2025 am 12:25 AM

Redis超越SQL數(shù)據(jù)庫的原因在於其高性能和靈活性。 1)Redis通過內(nèi)存存儲實現(xiàn)極快的讀寫速度。 2)它支持多種數(shù)據(jù)結(jié)構,如列表和集合,適用於復雜數(shù)據(jù)處理。 3)單線程模型簡化開發(fā),但高並發(fā)時可能成瓶頸。

用PhpStudy搭建動態(tài)PHP網(wǎng)站的步驟與示例 用PhpStudy搭建動態(tài)PHP網(wǎng)站的步驟與示例 May 16, 2025 pm 07:54 PM

使用PhpStudy搭建動態(tài)PHP網(wǎng)站的步驟包括:1.安裝PhpStudy並啟動服務;2.配置網(wǎng)站根目錄和數(shù)據(jù)庫連接;3.編寫PHP腳本生成動態(tài)內(nèi)容;4.調(diào)試和優(yōu)化網(wǎng)站性能。通過這些步驟,你可以從零開始搭建一個功能完整的動態(tài)PHP網(wǎng)站。

REDIS:揭示其目的和關鍵應用程序 REDIS:揭示其目的和關鍵應用程序 May 03, 2025 am 12:11 AM

Redisisanopen-Source,內(nèi)存內(nèi)部的庫雷斯塔氏菌,卡赫和梅斯吉級,excellingInsPeedAndVersatory.itiswidelysusedforcaching,Real-Timeanalytics,Session Management,Session Managements,and sessighterboarderboarderboardobboardotoitsssupportfortfortfortfortfortfortfortfortorvortfortfortfortfortfortforvortfortforvortforvortforvortfortforvortforvortforvortforvortdatastherctuct anddatataCcessandcessanddataaCces

See all articles