通過RedisCacheManager自定義緩存序列化(適用通過注解緩存數據)

?1.Redis 注解默認序列化機制

1.Spring Boot整合Redis組件提供的緩存自動配置類RedisCacheConfiguration(org.springframework.boot.autoconfigure.cache),

其內部是通過Redis連接工廠RedisConnectionFactory定義了一個緩存管理器RedisCacheManager;

同時定義RedisCacheManager時,也默認使用了JdkSerializationRedisSerializer序列化方式。

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisConnectionFactory.class)
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnMissingBean(CacheManager.class)
@Conditional(CacheCondition.class)
class RedisCacheConfiguration {@BeanRedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,ObjectProvider<RedisCacheManagerBuilderCustomizer> redisCacheManagerBuilderCustomizers,RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));List<String> cacheNames = cacheProperties.getCacheNames();if (!cacheNames.isEmpty()) {builder.initialCacheNames(new LinkedHashSet<>(cacheNames));}if (cacheProperties.getRedis().isEnableStatistics()) {builder.enableStatistics();}redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));return cacheManagerCustomizers.customize(builder.build());}private org.springframework.data.redis.cache.RedisCacheConfiguration determineConfiguration(CacheProperties cacheProperties,ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,ClassLoader classLoader) {return redisCacheConfiguration.getIfAvailable(() -> createConfiguration(cacheProperties, classLoader));}private org.springframework.data.redis.cache.RedisCacheConfiguration createConfiguration(CacheProperties cacheProperties, ClassLoader classLoader) {Redis redisProperties = cacheProperties.getRedis();org.springframework.data.redis.cache.RedisCacheConfiguration config = org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig();config = config.serializeValuesWith(SerializationPair.fromSerializer(new JdkSerializationRedisSerializer(classLoader)));if (redisProperties.getTimeToLive() != null) {config = config.entryTtl(redisProperties.getTimeToLive());}if (redisProperties.getKeyPrefix() != null) {config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());}if (!redisProperties.isCacheNullValues()) {config = config.disableCachingNullValues();}if (!redisProperties.isUseKeyPrefix()) {config = config.disableKeyPrefix();}return config;}}

??????2.如果想要使用自定義序列化方式的RedisCacheManager進行數據緩存操作,可以創建一個名為cacheManager的Bean組件,并在該組件中設置對應的序列化方式即可

2.自定義RedisCacheManager

@Bean
public?RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {// 分別創建String和JSON格式序列化對象,對緩存數據key和value進行轉換RedisSerializer<String>strSerializer?= new?StringRedisSerializer();Jackson2JsonRedisSerializer jacksonSeial?= new?Jackson2JsonRedisSerializer(Object.class);// 解決查詢緩存轉換異常的問題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);jacksonSeial.setObjectMapper(om);// 定制緩存數據序列化方式及時效RedisCacheConfiguration config?= RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(strSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial)).disableCachingNullValues();RedisCacheManager cacheManager?= RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();return cacheManager;
}

3.效果測試

項目啟動成功后,通過瀏覽器訪問http://localhost:8088/get/3,并重復刷新瀏覽器查看同一條數據信息 ,數據庫只執行了一次SQL語句

緩存結果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83313.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jupyter中的checkpoints為空/打不開解決辦法

jupyter中的checkpoints為空/打不開不要以為你是代碼有問題或者服務器有問題了&#xff0c;浪費我好幾天時間&#xff0c;我說怎么電腦上跑的好好的服務器上模型不見了 新建文件check 然后把checkpoints里的東西全部移動到check文件中就能看見了 checkpoints是Notebook的關鍵…

基于 Spring AI 的 MCP 客戶端/服務端實現

模型上下文協議&#xff08;MCP&#xff09;由Anthropic開源的開放協議&#xff0c;為AI模型與外部數據/工具提供了“標準化橋梁”&#xff0c;通過統一的接口規范&#xff0c;使模型能夠動態調用本地文件、數據庫、API等資源&#xff0c;實現“上下文感知”的智能交互。MCP的核…

python學習打卡day50

DAY 50 預訓練模型CBAM模塊 知識點回顧&#xff1a; resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 ps&#xff1a;今日的代碼訓練時長較長&#xff0c;3080ti大概需要40min的訓練時長 作業&#xff1a; 好好理解下resnet18的模型結構嘗試…

54、錯誤處理-【源碼流程】異常處理流程

54、錯誤處理-【源碼流程】異常處理流程 #### 異常處理流程概述 1. **執行目標方法**&#xff1a; - 程序執行目標方法&#xff0c;期間若發生異常&#xff0c;會被捕獲并記錄&#xff0c;標志當前請求結束。 - 將異常信息賦值給 dispatchException 變量。 2. **進入視圖解析…

使用 VSCode 開發 FastAPI 項目(1)

一、引言 FastAPI 是一款現代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于構建 API&#xff0c;使用 Python 3.7 及更高版本。它基于標準 Python 類型提示&#xff0c;具有自動生成文檔等出色功能。而 VSCode 憑借其輕量、強大的特性&#xff0c;為開發者…

Bash 腳本中的特殊變量

在 Bash 腳本和命令行中&#xff0c;?特殊變量?&#xff08;Special Variables&#xff09;主要用于獲取腳本或命令的上下文信息&#xff0c;如參數、進程狀態、返回值等。以下是常見的特殊變量及其典型應用場景&#xff1a; ?1. 腳本參數處理? $0、$1、$2 ... $9、${10}.…

免部署的數字人 API 調用教程:基于 wav2lip模型訓練的開放API,附 PHP 代碼示例

前言 去年我開始研究數字人模型算法&#xff0c;測試了市面上幾乎所有開源數字人模型&#xff0c;過程中踩了不少坑。最大的痛點就是訓練太燒顯卡了&#xff0c;光租顯卡的費用就花了我6個月的薪資&#xff0c;每次看到賬單都心疼。不過現在終于把基于wav2lip的數字人API做出來…

力扣HOT100之貪心算法:45. 跳躍游戲 II

這道題刷代碼隨想錄的時候也刷過&#xff0c;本來以為有了上一題55.跳躍游戲的基礎&#xff0c;這道題會好做一點&#xff0c;但是依舊想不出來思路&#xff0c;回去看了下自己當時寫的博客&#xff0c;沒想到今天的感受和當時的感受都一模一樣。。。What can I say?看了下代碼…

使用Docker申請Let‘s Encrypt證書

1、安裝Docker # 安裝Docker https://docs.docker.com/get-docker/# 安裝Docker Compose https://docs.docker.com/compose/install/# CentOS安裝Docker https://mp.weixin.qq.com/s/nHNPbCmdQs3E5x1QBP-ueA 2、申請Lets Encrypt證書 詳見&#xff1a; https://docs.linuxse…

算法題(167):FBI樹

審題&#xff1a; 本題需要我們將字符串按照題目要求進行遞歸展開&#xff0c;并按照后序遍歷的順序輸出 思路&#xff1a; 方法一&#xff1a;遞歸 首先我們需要模擬一下題目的意思 其實就是第一步判斷屬于什么字符&#xff0c;然后將字符串分兩半進行下一輪判斷。而由于題目要…

從“分散開發”到“智能協同” —— Gitee 如何賦能河南農擔構建金融級研發體系?

河南省農業信貸擔保有限責任公司&#xff08;以下簡稱「河南農擔」&#xff09;成立于 2016 年&#xff0c;是河南省屬骨干國有企業&#xff0c;承擔破解“三農”融資難題的重要職責。截至 2024 年底&#xff0c;河南農擔累計實現擔保規模 1037.05 億元&#xff0c;位居全國農擔…

青少年編程與數學 01-011 系統軟件簡介 14 Foxpro數據庫

青少年編程與數學 01-011 系統軟件簡介 14 Foxpro數據庫 一、歷史沿革二、技術架構三、主要功能四、應用場景五、產品版本六、使用方法七、技術價值八、歷史意義全文總結 **摘要&#xff1a;**FoxPro 是一款經典的桌面數據庫管理系統&#xff0c;起源于 1984 年的 FoxBASE&…

android studio向左向右滑動頁面

本文演示了Android Studio中使用ViewPager實現頁面切換的方法。通過創建包含3個頁面的ViewPager示例&#xff0c;詳細展示了實現步驟&#xff1a;1)在XML布局中配置ViewPager和切換按鈕&#xff1b;2)使用LayoutInflater動態加載頁面布局&#xff1b;3)自定義SimplePagerAdapte…

數據可視化新姿勢:Altair的聲明式魔法

文章目錄 一、告別編程式繪圖的苦日子二、5分鐘極速入門安裝篇&#xff08;記得先備好虛擬環境&#xff01;&#xff09;核心三劍客 三、高階玩法揭秘1. 交互功能秒實現2. 復合圖表so easy3. 魔改樣式有套路 四、避坑指南&#xff08;血淚經驗&#xff09;五、Altair vs 其他庫…

PostgreSQL --數據庫操作

一、基本操作 1、登錄 #切換pg用戶 su - postgres#重啟服務 pg_ctl -D /usr/local/pgsql/data -l logfile restart#進入pg psql2、數據庫操作 2.1、列出庫 \l\lselect datname from database; \l&#xff1a;輸出比\l多了Size,Tablespace 和 Description 列 &#xff1a;擴展輸…

樹莓派超全系列教程文檔--(63)rpicam-apps可用選項介紹之常用選項

rpicam-apps可用選項介紹之常用選項 rpicam-apps 選項參考常用選項helpversionlist-camerascameraconfigtimeoutpreviewfullscreenqt-previewnopreviewinfo-textwidth 和 heightviewfinder-width 和 viewfinder-heightmode打包格式詳細信息解壓格式詳細信息 viewfinder-modelor…

AI的發展過程:深度學習中的自然語言處理(NLP);大語言模型(LLM)詳解;Transformer 模型結構詳解;大模型三要素:T-P-G 原則

AI的發展過程&#xff1a;深度學習中的自然語言處理&#xff08;NLP&#xff09;&#xff1b;大語言模型&#xff08;LLM&#xff09;詳解&#xff1b;Transformer 模型結構詳解&#xff1b;大模型三要素&#xff1a;T-P-G 原則 AI的發展過程與大模型原理詳解一、AI的發展過程符…

SDXL 和 SDXL-Turbo 的區別

(1) SDXL&#xff08;Stable Diffusion XL&#xff09; 標準擴散模型&#xff0c;基于傳統的多步去噪&#xff08;通常 20~50 步&#xff09;。 訓練充分&#xff0c;特征更穩定&#xff0c;適合用于特征提取、方向學習&#xff08;如 LoRA、SAE&#xff09;。 計算成本高&am…

PyTorch:讓深度學習像搭積木一樣簡單!!!

文章目錄 &#x1f680; 一、 PyTorch的王炸&#xff1a;動態圖 vs 靜態圖靜態圖的“痛苦回憶”&#xff08;前方高能吐槽&#xff01;&#xff09;PyTorch動態圖的降維打擊&#x1f525; &#x1f525; 二、 不只是靈活&#xff01;PyTorch的三大殺器1. 張量&#xff08;Tenso…