這一章 考點不多
什么是緩存?為什么要設計出緩存?
企業級應用為了避免讀取數據時受限于數據庫的訪問效率而導致整體系統性能偏低,通
常會在應用程序與數據庫之間建立一種臨時的數據存儲機制,該臨時存儲數據的區域稱
為緩存。緩存是一種介于數據永久存儲介質與應用程序之間的數據臨時存儲介質,可以
提供臨時的數據存儲空間,合理使用緩存可以有效減少低速數據讀取(例如磁盤 IO )過
程的次數,以提高系統性能
Spring默認緩存?
申明式注解?
??@EnableCaching 注解
@EnableCaching 是 Spring 框架提供的用于 開啟基于注解的緩存支持的注解 ,當配置類上使用
@EnableCaching 注解,會默認提供 CacheManager 的實現,并通過 AOP 將緩存行為添加到應用程序。執行操作時,會檢查是否已經存在注解對應的緩存。如果找到了,就會自動創建一個代理攔截方法調用,使用緩存的 Bean 執行處理。?
@Cacheable 注解?
@Cacheable 注解用于標注可緩存的方法,通常標注的方法為數據查詢方法。標注 @Cacheable 注解的方法在執行時,會先查詢緩存,如果查詢到的緩存為空,則執行該方法,并將方法的執行結果添加到緩存;如果查詢到緩存數據,則不執行該方法,而是直接使用緩存數據?
注解屬性
屬性名 說明
value/cacheNames 指定緩存的名稱,必備屬性,這兩個屬性二選一使用
key 指定緩存數據的 key ,默認使用方法參數值,可以使用 SpEL 表達式
keyGenerator 指定緩存數據的 key 的生成器,與 key 屬性二選一使用
cacheManager 指定緩存管理器
cacheResolver 指定緩存解析器,與 cacheManager 屬性二選一使用
condition 指定在符合某條件下進行數據緩存
unless 指定在符合某條件下不進行數據緩存
sync 指定是否使用異步緩存,默認為 false
?value 和 cacheNames 屬性作用相同,用于指定緩存的名稱,二選一即可
@Cacheable("book")
public Book findById(Integer id){
return bookDao.findById(id).get();
}
@Cacheable 注解中可以指定多個緩存的名稱,以便使用多個緩存。
@Cacheable({"book","hotBook"})
public Book findById(Integer id){
return bookDao.findById(id).get();
}
?condition 屬性
condition 屬性用于對數據進行有條件的選擇性存儲,只有當指定條件為 true 時才會對查詢結果進行緩存,可以使用 SpEL 表達式指定屬性值
@Cacheable(cacheNames="book", condition="#id > 1")
public Book findBook(Integer id){
return bookDao.findById(id).get();
}
?unless 屬性
unless 屬性的作用與 condition 屬性相反,當指定的條件為 true 時,方法的返回值不會被緩存,也可以使用 SpEL 表達式指定
@Cacheable(cacheNames="book", unless = "#result==null")
public Book findBook(Integer id){
return bookDao.findById(id).get();
}
?sync 屬性
在多線程程序中,某些操作可能會同時引用相同的參數,導致相同的對象被計算好幾次,從而達不到緩存的目的。對于這種情況,可以使用 sync 屬性, sync 屬性表示數據緩存過程中是否使用同步模式,默認值為 false ,通常不會使用該屬性
??@CachePut 注解
?@CachePut 注 解 的 作 用 是 更 新 緩 存 數 據 , 當 需 要 更 新 緩 存 且 不 影 響 方 法 執 行 時 , 可 以 使 用@CachePut 注解,通常用在數據更新方法上。 @CachePut 注解的執行順序是,先進行方法調用,然后將方法結果更新到緩存中
兩者的區別?
@CachePut注解會強制執行方法并進行緩存更新,使用 @Cacheable 注解時,如果請求能夠在緩存中獲取到對應的數據,就不會執行當前被 @Cacheable 注解標注的方法?
??@CacheEvict 注解
@CacheEvict 注解的作用刪除緩存中的數據,通常標注在數據刪除方法上。 @CacheEvict 注解的默認執行順序是先進行方法調用,然后將緩存清除?
該注解有兩個屬性
allEntries 屬性
allEntries 屬性表示是否清除指定緩存空間中的所有緩存數據,默認值為 false ,即默認只刪除指定 key對應的緩存數據
allEntries 屬性
allEntries 屬性表示是否清除指定緩存空間中的所有緩存數據,默認值為 false ,即默認只刪除指定 key
對應的緩存數據。
@CacheEvict(cacheNames = "book",allEntries = true)
public void delById(Integer id){
bookDao.deleteById(id);
}
?beforeInvocation 屬性
beforeInvocation 屬性表示是否在方法執行之前進行緩存清除,默認值為 false ,即默認在執行方法后再進行緩存清除。
@CacheEvict(cacheNames = "book",beforeInvocation = true)
public void delById(Integer id){
bookDao.deleteById(id);
}
?@Caching 注解
?什么時候用?
如果不同緩存之間的條件或者鍵表達式不同,就需要指定相同類型的多個注解,例如需要同時指定多個@CacheEvict 或 @CachePut ,這個時候可以使用 @Caching 注解。 @Caching 注解用于針對復雜規 則 的 數 據 緩 存 管 理
@Caching 注 解 中 允 許 使 用 多 個 嵌 套的 @Cacheable 、 @CachePut 或 @CacheEvict 。 在 @Caching 注 解 內 部 包 含 有Cacheable 、 put 和 evict 三個屬性,分別對應于 @Cacheable 、 @CachePut 和 @CacheEvict 三個注解?
@CacheConfig
@CacheConfig 注解使用在類上,主要用于統籌管理類中所有使用 @Cacheable 、 @CachePut 和@CacheEvict 注解標注方法中的公共屬性
@CacheConfig(cacheNames = "book")
@Service
public class BookService {
@Autowired
private BookRepository bookRepository;
@Cacheable
public Book findById(Integer id){
return bookRepository.findById(id).get();
}
}
?
Spring整合Redis?
?
?第6章題目
一、填空題
1.Spring Boot項目中開啟緩存管理后,如果沒有任何緩存組件,默認使用 Simple? ?緩存組件進行管理。?
2.當配置類上使用 @EnableCaching? ? 注解,會默認提供CacheManager的實現,并通過AOP將緩存行為添加到應用程序。?
3.? ?@Cacheconfig? 注解主要用于統籌管理類中所有聲明式緩存注解的公共屬性。?
4.@Cacheable注解的? value? ?屬性和cacheNames屬性都可以指定緩存的名稱。?
5. Spring Boot項目中,全局配置文件中spring.cache.redis.key-prefix用于指定Redis中緩存key的? ? 前綴?。
二、判斷題
1. CacheManager是緩存管理器,基于緩存名稱對緩存進行管理。(對?)
2.標注@Cacheable注解的方法執行時,會先進行查詢緩存,如果查詢到緩存數據,則不執行該方法。 (對 )
3.@Cacheable注解的value和cacheNames屬性作用相同,且要二選一使用。 (對 )
4.Ehcache配置文件中,只有eternal為false時timeToLiveSeconds的設置才有效。 ( 對)
5.Ehcache要將緩存持久化到本地磁盤,則操作的實體類需要實現序列化接口。 (對 )
三、選擇題
1.下列選項中,關于Spring Boot默認緩存方案說法錯誤的是(D)。?
A.Spring Boot繼承了Spring框架的緩存管理功能。
B.Spring的緩存機制將提供的緩存作用于Java方法上。
C.Spring的默認的緩存方案通過Cache和CacheManager接口統一不同的緩存技術。
D.Spring中的Cache接口制定了管理Cache的規則。
解析:
CacheManager接口負責制定管理緩存(如創建、獲取、刪除Cache實例)的規則,而 **Cache接口 ** 僅定義了操作緩存數據的方法(如get()、put()、evict()等)
2.下列選項中,對于@Cacheable注解的屬性說明錯誤的是(A)。?
A.value用于指定CacheManager的實現。
B.key用于指定緩存數據的key。
C.keyGenerator用于指定緩存數據的key的生成器。
D.cacheManager用于指定緩存管理器。
解析:
用于指定緩存的名稱
3.下列選項中,對于聲明式緩存注解的描述錯誤的是(B)。?
A.@EnableCaching是Spring框架提供的用于開啟基于注解的緩存支持的注解。
B.@CachePut注解的執行順序是,先將方法結果更新到緩存中,再進行方法調用。
C.@CachePut注解的作用是更新緩存數據。
D.@CacheEvict注解的默認執行順序是,先進行方法調用,然后將緩存進行清除。
4.下列選項中,對于類上標注@CacheConfig(cacheNames = "book")的描述正確的是(C)。?
A.聲明當前類中共享的屬性cacheNames的值為book。
B.類中所有方法上使用緩存注解時cacheNames屬性的值默認都為book。
C.如果類的方法上再次定義cacheNames屬性,那么cacheNames屬性的值最終為方法上指定的屬性值。
D.類的方法上可以再次定義cacheNames屬性的值。
5.下列選項中,Ehcache配置文件中用于指定是否啟用磁盤持久化的屬性是(D)。?
A.external
B.diskPersistent
C.maxElementsInMemory
D.memoryStoreEvictionPolicy
解析:
讀英語即可,memoryStoreEvictionPolicy,內存+儲存+政策=是否啟用磁盤持久化