Spring Cache與Redis集成原理

一、核心架構圖解

業務方法
Spring Cache抽象層
CacheManager
RedisCache
RedisTemplate
Redis服務器

二、關鍵組件解析

1. 緩存注解與Redis映射

@Cacheable(value = "users", key = "#id")
public User getUser(Long id) { ... }
  • Redis鍵生成cacheName::SpEL表達式結果
  • 值序列化:默認使用JDK序列化,推薦JSON

2. RedisCacheManager配置

@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(SerializationPair.fromSerializer(redisSerializer())).entryTtl(Duration.ofMinutes(30));return RedisCacheManager.builder(factory).cacheDefaults(config).build();
}

三、數據存儲結構

1. Redis數據結構

# String類型存儲
SET "users::1001" "{\"id\":1001,\"name\":\"Alice\"}"# Hash類型存儲(當使用@Cacheable的cacheNames多級時)
HSET "users" "1001" "{\"id\":1001,\"name\":\"Alice\"}"

2. TTL管理

0秒 300秒 600秒 900秒 1200秒 1500秒 1800秒 緩存創建 有效存活期 訪問續期 緩存條目 緩存生命周期

四、緩存操作流程

應用程序 Spring Cache Redis服務器 調用@Cacheable方法 生成key并查詢 返回緩存數據 反序列化返回 執行實際方法 獲取結果 序列化存儲 alt [緩存命中] [緩存未命中] 應用程序 Spring Cache Redis服務器

五、高級特性實現

1. 緩存穿透防護

@Cacheable(value = "users", key = "#id", unless = "#result == null")
public User getUser(Long id) { // 返回null時不緩存
}

2. 分布式鎖同步

@CachePut(value = "users", key = "#user.id")
@Transactional
public User updateUser(User user) {// 使用Redisson實現分布式鎖RLock lock = redissonClient.getLock("user_lock:" + user.getId());try {lock.lock();// 業務邏輯} finally {lock.unlock();}
}

六、性能優化策略

1. 序列化優化

@Bean
public RedisTemplate<String, Object> redisTemplate() {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;
}

2. 批量操作

@Cacheable(value = "users", keyGenerator = "batchKeyGenerator")
public List<User> batchGetUsers(List<Long> ids) {// 使用Redis管道批量獲取
}

七、監控與故障排查

1. 緩存命中率統計

Cache cache = cacheManager.getCache("users");
RedisCacheStatistics stats = ((RedisCache) cache).getStatistics();
System.out.println("命中率: " + stats.getHitRatio());

2. 常見問題排查表

現象可能原因解決方案
緩存數據不一致未正確使用@CacheEvict添加事務管理,確保先更新數據庫再清除緩存
反序列化失敗序列化方式不一致統一客戶端和服務端的序列化配置
內存溢出未設置TTL或內存淘汰策略配置合理的過期時間和LRU淘汰策略
高延遲大Value值存儲壓縮數據或拆分存儲

通過合理配置Spring Cache與Redis的集成,可以實現:

  • 透明化緩存管理:業務代碼無需關注緩存實現
  • 高性能數據訪問:減少數據庫壓力
  • 分布式一致性:通過Redis實現多節點緩存同步
  • 靈活的策略配置:按需定制過期時間、序列化方式等

實際應用中需注意:

  1. 避免過度緩存導致內存壓力
  2. 保持緩存與數據源的一致性
  3. 監控緩存命中率和響應時間
  4. 定期進行緩存清理和維護

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

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

相關文章

編程技能:調試02,設置斷點與刪除斷點

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;調試01&#xff0c;調試介紹 回到目錄 下…

flink寫doris時的優化

1.概念 doris并不擅長高頻、小量數據的導入&#xff1b; 因為doris每一次數據導入都會在be節點上生成數據文件&#xff1b;如果高頻導入小量數據&#xff0c;就會在存儲層產生大量的小文件&#xff08;必然會影響到后續的查詢效率&#xff0c;也會對系統產生更多的compaction…

ElementNotInteractableException原因及解決辦法

在自動化測試中,ElementNotInteractableException是一個常見的異常,它通常發生在嘗試與網頁上的某個元素進行交互(例如點擊、輸入等操作)時,但由于該元素當前不可交互。這可能由多種原因引起,以下是一些常見的原因及其解決方法: 元素未完全加載 如果嘗試與頁面上的元素交…

如何從 GitHub 鏡像倉庫到極狐GitLab?

最近 GitHub 封禁中國用戶的事情鬧得沸沸揚揚,雖然官方發布的報道說中國用戶被限制登錄是因為配置錯誤導致,已經撤回了更新,中國用戶已經可以正常使用。但是這就像橫在國內開發者和企業頭上的“達摩克利斯之劍”。為了避免 GitHub 不可用而帶來的影響,國內開發者和企業可以…

服務器安裝nacos

1.下載依賴 docker pull nacos/nacos-server:v2.4.3安裝 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server:v2.4.3把nacos中的data 文件和conf 文件copy到自己服務的文件夾 docker cp nacos-server:/home/nacos/data /home/admin1/…

Matter協議暗戰:蘋果、谷歌、亞馬遜的智能家居霸權爭奪

原文地址&#xff1a;Matter協議暗戰&#xff1a;蘋果、谷歌、亞馬遜的智能家居霸權爭奪 一、Matter 協議&#xff1a;巨頭聯手打造的 “智能家居聯合國” 1.1 從 CHIP 到 Matter&#xff1a;標準統一的十年長跑 智能家居發展多年&#xff0c;卻始終被 “孤島效應” 困擾。各…

軟件設計師2009-2022歷年真題與答案解析(附pdf下載)

軟考在即&#xff0c;現在給大家分享一下軟件設計師2009-2022真題與答案解析 pdf全套&#xff0c;文末提供大家免費下載&#xff0c;大家都知道在軟考備考過程中&#xff0c;擁有一套全面且實用的考試資料對于考生來說至關重要。目錄如下&#xff1a; 歷年真題及詳解2004-2019 …

基于EasyX庫開發的球球大作戰游戲

目錄 球球大作戰 一、開發環境 二、流程圖預覽 三、代碼邏輯 1、初始化時間 2、設置開始界面大小 3、設置開始界面 4、讓玩家選擇速度 5、設置玩家小球、人機小球、食物的屬性 6、一次性把圖繪制到界面里 7、進入死循環 8、移動玩家小球 9、移動人機 10、食物刷新…

aslist和list的區別

?Arrays.asList和List的主要區別在于它們的固定長度和不可變性、與原始數組的關系、性能以及使用場景。 一、固定長度和不可變性 ?Arrays.asList?&#xff1a;通過Arrays.asList方法創建的List是一個固定長度的List&#xff0c;其長度與原始數組相同。這意味著你不能通過添…

大模型預標注和自動化標注在OCR標注場景的應用

OCR&#xff0c;即光學字符識別&#xff0c;簡單來說就是利用光學設備去捕獲圖像并識別文字&#xff0c;最終將圖片中的文字轉換為可編輯和可搜索的文本。在數字化時代&#xff0c;OCR&#xff08;光學字符識別&#xff09;技術作為處理圖像中文字信息的關鍵手段&#xff0c;其…

stm32工程,拷貝到另一臺電腦編譯,錯誤提示頭文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 這個頭文件 . 于是我在原電腦工程文件里找也沒有找到這個頭文件 接下來查看原電腦keil的頭文件引入配置,發現只引入了工程文件下的頭文件, 那么core_cm4.h到底哪里來的? (到現在我也不清楚怎…

STM32 模塊化開發指南 · 第 2 篇 如何編寫高復用的外設驅動模塊(以 UART 為例)

本文是《STM32 模塊化開發實戰指南》的第 2 篇,聚焦于“串口驅動模塊的設計與封裝”。我們將從一個最基礎的裸機 UART 初始化開始,逐步實現:中斷支持、環形緩沖收發、模塊接口抽象與測試策略,構建一個可移植、可擴展、可復用的 UART 驅動模塊。 一、模塊化 UART 的設計目標…

【NLP 59、大模型應用 —— 字節對編碼 bpe 算法】

目錄 一、詞表的構造問題 二、bpe(byte pair encoding) 壓縮算法 算法步驟 示例&#xff1a; 步驟 1&#xff1a;初始化符號表和頻率統計 步驟 2&#xff1a;統計相鄰符號對的頻率 步驟 3&#xff1a;合并最高頻的符號對 步驟 4&#xff1a;重復合并直至終止條件 三、bpe在NLP中…

TMS320F28P550SJ9學習筆記15:Lin通信SCI模式結構體寄存器

今日初步認識與配置使用Lin通信SCI模式&#xff0c;用結構體寄存器的方式編程 文章提供完整工程下載、測試效果圖 我的單片機平臺是這個&#xff1a; LIN通信引腳&#xff1a; LIN通信PIE中斷&#xff1a; 這個 PIE Vector Table 表在手冊111頁&#xff1a; 這是提到LINa的PI…

linux-設置每次ssh登錄服務器的時候提醒多久需要修改密碼

在 Linux 系統中,你可以通過設置 motd(Message of the Day)或 sshd 配置來在用戶通過 SSH 登錄時提醒他們密碼即將過期。以下是具體步驟: 方法 1: 使用 motd 文件 motd 文件在用戶登錄時顯示,你可以通過腳本動態生成內容,提醒用戶密碼過期時間。 編輯 /etc/motd 文件:…

matlab求和∑函數方程編程?

matlab求和∑函數方程編程&#xff1f; 一 題目&#xff1a;求下列函數方程式的和 二&#xff1a;代碼如下&#xff1a; >> sum_result 0; % 初始化求和變量 for x 1:10 % 設…

electron桌面端開發-打開指定軟件和文件

electron桌面端開發 現在越來越多的軟件開發已經趨向于簡單化&#xff0c;桌面端開發已經不在依賴之前的java、c等主流技術&#xff0c;目前基于node的開發越來越廣泛。功能點也越來越多元化。 文章目錄 electron桌面端開發前言一、打開文件的方式&#xff1f;二、exec使用步驟…

ShenNiusModularity項目源碼學習(17:ShenNius.Admin.Mvc項目分析-2)

ShenNiusModularity項目的后臺管理主頁面如下圖所示&#xff0c;該頁面為ShenNius.Admin.Mvc項目的Views\Home\Index.cshtml&#xff0c;使用的是layuimini后臺模板&#xff08;參考文獻2&#xff09;&#xff0c;在layuimini的GitHub主頁中提供有不同樣式的頁面模版鏈接&#…

SpringBoot 與 Vue3 實現前后端互聯全解析

在當前的互聯網時代&#xff0c;前后端分離架構已經成為構建高效、可維護且易于擴展應用系統的主流方式。本文將詳細介紹如何利用 SpringBoot 與 Vue3 構建一個前后端分離的項目&#xff0c;展示兩者如何通過 RESTful API 實現無縫通信&#xff0c;讓讀者了解從環境搭建、代碼實…

portainer.io篇

Portainer?是一個輕量級的容器管理工具&#xff0c;支持Docker、Kubernetes、Docker Swarm、ACI和Nomad等多種平臺。它提供了一個直觀的Web界面&#xff0c;使用戶能夠輕松地管理和監控容器&#xff0c;包括創建、啟動、停止、刪除容器&#xff0c;以及查看容器的日志和配置信…