Spring Cache緩存框架

来源:https://www.cnblogs.com/javazhishitupu/archive/2022/03/29/16072083.html
-Advertisement-
Play Games

一、序言 Spring Cache是Spring體系下標準化緩存框架。Spring Cache有如下優勢: 緩存品種多 支持緩存品種多,常見緩存Redis、EhCache、Caffeine均支持。它們之間既能獨立使用,也能組合使用。 平滑遷移 Spring內部支持的緩存,可實現無縫平滑遷移,無需修改 ...


一、序言

Spring Cache是Spring體系下標準化緩存框架。Spring Cache有如下優勢:

  • 緩存品種多

支持緩存品種多,常見緩存RedisEhCacheCaffeine均支持。它們之間既能獨立使用,也能組合使用。

  • 平滑遷移

Spring內部支持的緩存,可實現無縫平滑遷移,無需修改業務邏輯。註解緩存的實現依賴於動態代理。

大多數情況下使用的是註解版、少數情況下也能使用編程版。註解版與業務代碼高度解藕,因其依托動態代理技術實現,使用場景上有一定的限制。編程版嵌入業務代碼,代碼順序執行,無前置使用條件。

二、基本概念

(一)核心概念

一個應用可以有多個緩存管理器,每個緩存管理器可以有多個緩存,每個緩存可以存儲多條記錄。

1、緩存管理器

緩存的存儲介質不同、緩存連接不同的資料庫、緩存值序列化等由緩存管理器配置。緩存管理器有主次之分,預設情況下使用主(首要)緩存管理器。

當服務內只有一個CacheManager時,預設使用此緩存管理器;當超過一個緩存管理器時,需要使用Primary註解指定預設緩存管理器。

2、緩存

Cache是一組配置相同緩存的集合,可以理解為命名空間,Spring Cache體系下的緩存生命時間是以Cache為單位的,不支持以Key為單位設置生存時間。不同的業務對應不同的緩存配置,應在緩存處予以區分。

CacheName應具有顯著的業務區分度以及過期時間區分度,並且以全局常量的方式提供,採取集中化管理的方式,禁止採用魔術變數的方式指定CacheName。

(二)補充內容

一般來說緩存的Key與Value均是String類型,特別是Value通常序列化成JSON串。

三、註解版

用於基於註解的方式來管理緩存數據。註解緩存有如下優勢:

  • 高度解藕

使用註解來實現緩存,與業務高度解藕。

  • 靈活管理

通過全局配置,不修改緩存邏輯,可實現如下效果:

開發環境下,可禁用緩存,將流量打入資料庫,儘早的暴露可能存在的性能瓶頸;測試環境開啟緩存,進行壓力測試等。

(一)動態代理

Spring Cache緩存註解版的原理以及緩存配置失敗的典型案例。

1、CGLib動態代理

緩存的實現底層技術支持是CGLib動態代理,在目標方法調用前、後分別追加相應的緩存操作,以達到添加緩存、更新緩存、刪除緩存的操作。

如果註解緩存配置未生效,檢查目標調用方法是否被動態代理。

2、配置失效

配置失效是指儘管配置了緩存註解,但緩存仍然未生效。

  • final類與final方法

final類與final方法不滿足CGLib動態代理的條件,因此緩存配置會失效。

  • 內部調用

使用依賴註入的方式調用配置緩存的方法生效,方法間內部調用不生效。

  • 非public方法

非public方法配置緩存不生效。

(二)常用註解

1、配置註解

(1)EnableCaching

標註於SpringBoot應用啟動類上,添加此註解表示開啟Spring Cache緩存;移除表示關閉緩存。如果在全局配置文件中添加如下配置,即使在啟動類上標註EnableCaching註解,Spring Cache緩存然後是關閉狀態。

spring:
  cache:
    type: none

如果應用中自定義獨立於Spring容器的緩存,則不受此配置影響。

(2)CacheConfig

標註於類上,更具體的說是標註於業務服務類上。統一配置如下參數信息:

參數 含義 使用說明
cacheManager 緩存管理器 預設指首要的CacheManager
cacheNames 緩存名
keyGenerator key值生成器

在類上統一進行配置,類下的方法自動繼承相應的配置。

2、緩存註解

(1)Cacheable

添加緩存的核心註解,分兩種情況:一是對應key值未有緩存數據,先執行方法,然後根據condition和unless條件決定是否添加緩存;二是對應key值已有緩存,不執行方法體,直接返回數據。

參數keyGeneratorkey是互斥的,當key存在時keyGenerator配置自動失效。

  • 基礎參數
參數 含義 使用說明
cacheManager 緩存管理器 預設指首要的CacheManager
cacheNames 緩存名
keyGenerator key值生成器
key key值
  • 高級參數
參數 含義 預設值 使用說明
condition 緩存條件 指示滿足條件方執行緩存操作,一般使用參數作為條件
unless 否定緩存 當條件為 true ,方法的返回值不會被緩存
sync 同步狀態 false 表示將方法執行結果以何種方式存入緩存

(2)CachePut

更新緩存註解。不管對應key值是否有緩存數據,都執行。

  • 基礎參數
參數 含義 使用說明
cacheManager 緩存管理器 預設指首要的CacheManager
cacheNames 緩存名
keyGenerator key值生成器
key key值
  • 高級參數
參數 含義 使用說明
condition 緩存條件 指示滿足條件方執行緩存操作,一般使用參數作為條件
unless 否定緩存 當條件為 true ,方法的返回值不會被緩存

(3)CacheEvict

主動清除緩存註解。

  • 基礎參數
參數 含義 使用說明
cacheManager 緩存管理器 預設指首要的CacheManager
cacheNames 緩存名
keyGenerator key值生成器
key key值
  • 高級參數
參數 含義 預設值 使用說明
condition 緩存條件 指示滿足條件方執行緩存操作,一般使用參數作為條件
allEntries 所有緩存 false 表示是否清空當前CacheName對應的所有緩存
beforeInvocation 調用前 false 表示是否在方法調用前清空緩存
3、KeyGenerator

預設情況下使用SimpleKeyGenerator鍵值生成器,當不指定key值時,根據生成器規則,將方法參數轉化為緩存Key值。

喜歡本文就【♥️推薦♥️】一下,激勵我持續創作。這個Github同樣精彩,收到您的star我會很激動。本文歸檔在專題博客,視頻講解在B站


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 開發環境 python 3.8pycharm 2021.2 專業版 代碼實現 發送請求 獲取數據 解析數據(篩選數據) 保存數據 連接資料庫 對於本篇文章有疑問的同學可以加【資料白嫖、解答交流群:910981974】 開始代碼 請求數據 # 偽裝 headers = { 'cookie': ' ...
  • 一個簡單的Java程式 // HelloJava.java public class HelloJava { public static void main(String[] args) { System.out.println("Hello Java!"); } } Java是區分大小寫的 關鍵字 ...
  • finally的特點 finally:被finally控制的語句體一定會執行 * 註意:如果在執行到finally之前jvm退出了,就不能執行了。 * * A:格式 * try...catch...finally... * B:用於釋放資源,在IO流操作和資料庫操作中會見到 package cn.i ...
  • 練習: 存儲學生對象並遍歷,創建TreeSet集合使用無參構造方法,並按照年齡從小到大的順序排序,若年齡相同再按照姓名的字母順序排序 分析: 1.創建學生類,成員變數name,age;無參構造,帶參構造;get\set方法; 2.創建測試類,添加數據併進行排序;直接排序會報錯 3.需要Student ...
  • 過濾器就是過濾條件,對已經定位到數組中的 DOM 對象進行過濾篩選,過濾條件不能獨立出現在 jquery 函數,如果使用只能出現在選擇器後方 ...
  • 背景 很多時候,我們項目在開發環境和生成環境的環境配置是不一樣的,例如,資料庫配置,在開發的時候,我們一般用測試資料庫,而在生產環境的時候,我們是用正式的數據,這時候,我們可以利用profile在不同的環境下配置用不同的配置文件或者不同的配置。 解決方案 spring boot允許你通過命名約定按照 ...
  • 程式的異常:Throwable * 嚴重問題:Error 我們不處理。這種問題一般都是很嚴重的,比如說記憶體溢出。 * 問題:Exception * A:編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。 * B:運行期問題:RuntimeExcep ...
  • 一、前言 掃描件一直受大眾青睞,任何紙質資料在掃描之後進行存檔,想使用時手機就能打開,省心省力。但是掃描件的優點也恰恰造成了它的一個缺點,因為是通過電子設備掃描,所以出來的是圖像,如果想要處理文件上的內容,直接操作是無法實現的。 那要是想要引用其中的內容怎麼辦呢?別擔心,Python幫你解決問題。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...