spring cache相關注解介紹 @Cacheable、@CachePut、@CacheEvict

?

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

@Cacheable是用來聲明方法是可緩存的。將結果存儲到緩存中以便后續使用相同參數調用時不需執行實際的方法。直接從緩存中取值。最簡單的格式需要制定緩存名稱。?
例如:

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

在上面的代碼片段中,findBook方法與名為books的緩存想關聯。每次調用該方法時,將在緩存中檢查該請求是否已執行,以免重復執行。雖然在大多數情況下,只有一個緩存被聲明,注釋允許指定多個名稱,以便使用多個緩存。這種情況下,在執行方法之前,每個緩存都會檢查之前執行的方法,只要有一個緩存命中,即直接從緩存中返回相關的值。?
即使沒有實際執行緩存方法,所有其他不包含該值的緩存也將被更新。?
例如:

@Cacheable({"books", "isbns"})
public Book findBook(ISBN isbn) {...}

默認key生成:?
默認key的生成按照以下規則:?
- 如果沒有參數,則使用0作為key?
- 如果只有一個參數,使用該參數作為key?
- 如果又多個參數,使用包含所有參數的hashCode作為key

自定義key的生成:?
當目標方法參數有多個時,有些參數并不適合緩存邏輯?
比如:

@Cacheable("books")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

其中checkWarehouse,includeUsed并不適合當做緩存的key.針對這種情況,Cacheable 允許指定生成key的關鍵屬性,并且支持支持SpringEL表達式。(推薦方法)?
再看一些例子:

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#map['bookid'].toString()")
public Book findBook(Map<String, Object> map)

緩存的同步 sync:?
在多線程環境下,某些操作可能使用相同參數同步調用。默認情況下,緩存不鎖定任何資源,可能導致多次計算,而違反了緩存的目的。對于這些特定的情況,屬性 sync 可以指示底層將緩存鎖住,使只有一個線程可以進入計算,而其他線程堵塞,直到返回結果更新到緩存中。?
例:

@Cacheable(cacheNames="foos", sync="true")
public Foo executeExpensiveOperation(String id) {...}

屬性condition:?
有時候,一個方法可能不適合一直緩存(例如:可能依賴于給定的參數)。屬性condition支持這種功能,通過SpEL 表達式來指定可求值的boolean值,為true才會緩存(在方法執行之前進行評估)。?
例:

@Cacheable(cacheNames="book", condition="#name.length < 32")
public Book findBook(String name)

此外,還有一個unless 屬性可以用來是決定是否添加到緩存。與condition不同的是,unless表達式是在方法調用之后進行評估的。如果返回false,才放入緩存(與condition相反)。 #result指返回值 例:

@Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.name.length > 5"")
public Book findBook(String name)

@CachePut

如果緩存需要更新,且不干擾方法的執行,可以使用注解@CachePut。@CachePut標注的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,并將執行結果以鍵值對的形式存入指定的緩存中。

@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor)

注意:應該避免@CachePut 和 @Cacheable同時使用的情況。

@CacheEvict annotation

spring cache不僅支持將數據緩存,還支持將緩存數據刪除。此過程經常用于從緩存中清除過期或未使用的數據。?
@CacheEvict要求指定一個或多個緩存,使之都受影響。此外,還提供了一個額外的參數allEntries 。表示是否需要清除緩存中的所有元素。默認為false,表示不需要。當指定了allEntries為true時,Spring Cache將忽略指定的key。有的時候我們需要Cache一下清除所有的元素。

@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)

清除操作默認是在對應方法成功執行之后觸發的,即方法如果因為拋出異常而未能成功返回時也不會觸發清除操作。使用beforeInvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,Spring會在調用該方法之前清除緩存中的指定元素。

@CacheEvict(cacheNames="books", beforeInvocation=true)
public void loadBooks(InputStream batch)

@CacheConfig

有時候一個類中可能會有多個緩存操作,而這些緩存操作可能是重復的。這個時候可以使用@CacheConfig

@CacheConfig("books")
public class BookRepositoryImpl implements BookRepository {@Cacheablepublic Book findBook(ISBN isbn) {...}
}

@CacheConfig是一個類級別的注解,允許共享緩存的名稱、KeyGenerator、CacheManager 和CacheResolver。?
該操作會被覆蓋。

開啟緩存注解

java類配置:

@Configuration
@EnableCaching
public class AppConfig {
}

XML 配置:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:cache="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"><cache:annotation-driven /></beans>

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

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

相關文章

layui 渲染select下拉選項 ,日期控件的用法

最近項目中用到關于layui的前端技術&#xff0c;在使用layui 渲染select option下拉復選框時出現了沒有值渲染的問題&#xff0c;還有使用layui日期的過程 &#xff0c;接下來就一起看看吧。 /** *從后臺渲染字段民族數據/<div class"layui-inline"><labe…

CF1082G Petya and Graph(最小割,最大權閉合子圖)

QWQ嚶嚶嚶 感覺是最水的一道\(G\)題了 順便記錄一下第一次在考場上做出來G qwqqq 題目大意就是說&#xff1a; 給你n個點&#xff0c;m條邊&#xff0c;讓你選出來一些邊&#xff0c;最大化邊權減點權 \(n\le 1000\) QWQ 看完這個題和數據范圍&#xff0c;第一感覺就是網絡流啊…

NET Core微服務之路:讓我們對上一個Demo通訊進行修改,完成RPC通訊

最近一段時間有些事情耽擱了更新&#xff0c;抱歉各位了。上一篇我們簡單的介紹了DotNetty通信框架&#xff0c;并簡單的介紹了基于DotNetty實現了回路&#xff08;Echo&#xff09;通信過程。我們來回憶一下上一個項目的整個流程&#xff1a;當服務端啟動后&#xff0c;綁定并…

Centos7防火墻設置

查看防火墻狀態 or rootlocalhost ~]# systemctl status firewalld / firewall-cmd --state 啟動防火墻 [rootlocalhost ~]# systemctl start firewalld 關閉防火墻 [rootlocalhost ~]# systemctl stop firewalld 設置開機啟動 [rootlocalhost ~]# systemctl enable fi…

HTTP協議中POST、GET、HEAD、PUT等請求方法及相應值得含義

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 請求方法是請求一定的Web頁面的程序或用于特定的URL。可選用下列幾種&#xff1a; GET&#xff1a; 請求指定的頁面信息&#xff0c;并…

java面試題文檔(QA)

– 基礎篇 1、 Java語言有哪些特點2、面向對象和面向過程的區別3 、八種基本數據類型的大小&#xff0c;以及他們的封裝類4、標識符的命名規則。5、instanceof 關鍵字的作用6、Java自動裝箱與拆箱7、 重載和重寫的區別8、 equals與的區別9、 Hashcode的作用10、String、String …

第四次軟件工程作業

關于 石墨文檔客戶端 的案例分析 作業地址&#xff1a; https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 第一部分 調研&#xff0c; 評測 1.下載并使用&#xff0c;按照描述的bug定義&#xff0c;找3~5個功能性的比較嚴重的bug。請用專業的語言描述&#xff08;每個…

深入剖析C++中的string類

一&#xff0c;C語言的字符串 在C語言里&#xff0c;對字符串的處理一項都是一件比較痛苦的事情&#xff0c;因為通常在實現字符串的操作的時候都會用到最不容易駕馭的類型——指針。 比如下面這個例子&#xff1a; //example 1: char str[12] "Hello"; char *…

Apple System: Error: ENFILE: file table overflow

2019獨角獸企業重金招聘Python工程師標準>>> 在MAC上跑nodejs&#xff0c;遇到了一個問題&#xff1a;file table overflow 主要意思就是說文件打開太多了&#xff0c;超過了限制&#xff0c;產生這個問題主要是蘋果操作系統的限制。 echo kern.maxfiles65536 | sud…

springboot的緩存技術

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我門知道一個程序的瓶頸在于數據庫&#xff0c;我門也知道內存的速度是大大快于硬盤的速度的。當我門需要重復的獲取相同的數據的時候&a…

深度優先遍歷解決連通域求解問題-python實現

問題描述 在一個矩形網格中每一個格子的顏色或者為白色或者為黑色。任意或上、或下、或左、或右相鄰同為黑色的格子組成一個家族。家族中所有格子的數量反映家族的大小。要求找出最大家族的家族大小&#xff08;組成最大家族的格子的數量&#xff09;并統計出哪些點屬于哪一族。…

字符串進階

C風格字符串 1、字符串是用字符型數組存儲的&#xff0c;字符串要求其尾部以’\0’作為結束標志。如&#xff1a; char string[ ]”C programming language”; 用sizeof來測string長度為25個字節&#xff0c;而實際串本身長度(含空格)為24個字節&#xff0c;多出來的一個就是…

flask上傳excel文件,無須存儲,直接讀取內容

運行環境python3.6 import xlrd from flask import Flask, requestapp Flask(__name__)app.route("/", methods[POST, GET]) def filelist1():print(request.files)file request.files[file]print(file, type(file), file)print(file.filename) # 打印文件名f …

分布式 ID的 9 種生成方式

一、為什么要用分布式 ID&#xff1f; 在說分布式 ID 的具體實現之前&#xff0c;我們來簡單分析一下為什么用分布式 ID&#xff1f;分布式 ID 應該滿足哪些特征&#xff1f; 1、什么是分布式 ID&#xff1f; 拿 MySQL 數據庫舉個栗子&#xff1a; 在我們業務數據量不大的時…

spring boot Redis集成—RedisTemplate

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Spring boot 基于Spring, Redis集成與Spring大同小異。 文章示例代碼均以前篇筆記為基礎增加修改&#xff0c;直接上代碼&#xff1a;…

QtCreator無法編輯源文件

在Qt Creator中新建工程&#xff0c;添加現有C源文件&#xff0c;有的源文件可以編輯&#xff0c;有的源文件編輯不了&#xff0c;發現無法編輯的源文件有一個共同特點&#xff0c;即其中都包含中文&#xff0c;且中文出現亂碼&#xff0c;于是&#xff0c;點擊Qt Creator菜單欄…

Unicode簡介和使用

一、Unicode簡介 在第一章中&#xff0c;我已經預告&#xff0c;C語言中在Microsoft Windows程序設計中扮演著重要角色的任何部分都會講述到&#xff0c;您也許在傳統文字模式程序設計中還尚未遇到過這些問題。寬字符集和Unicode差不多就是這樣的問題。 簡單地說&#xff0c;…

webpack4.x 模塊化淺析-CommonJS

先看下webpack官方文檔中對模塊的描述&#xff1a; 在模塊化編程中&#xff0c;開發者將程序分解成離散功能塊(discrete chunks of functionality)&#xff0c;并稱之為模塊。每個模塊具有比完整程序更小的接觸面&#xff0c;使得校驗、調試、測試輕而易舉。 精心編寫的模塊提供…

設計模式--抽象工廠(個人筆記)

一、抽象工廠的應用場景以及優缺點 1 應用場景&#xff1a; 如果系統需要多套的代碼解決方案&#xff0c;并且每套的代碼解決方案中又有很多相互關聯的產品類型&#xff0c;并且在系統中我們可以相互替換的使用一套產品的時候可以使用該模式&#xff0c;客戶端不需要依賴具體的…

利用阿里云OSS對文件進行存儲,上傳等操作

--pom.xml加入阿里OSS存儲依賴 <!--阿里云OSS存儲--> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.8.3</version> </dependency> --配置阿里云oss相關常量參數 /…