日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Cache-缓存注解(二)

發布時間:2025/3/21 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cache-缓存注解(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 導讀
  • 概述
  • 注解@Cacheable 和@CachePut
    • 表達式值的引用
  • 注解@CacheEvict
  • 案例

導讀

Spring-Cache手札

Spring Cache抽象-緩存注解

實戰-Redis-20Spring緩存機制整合Redis

關于Spring Cache以及注解,之前總結了幾篇。現在我們再來細化下


概述

注解描述
@Cacheable表明在進入方法之前, Spring 會先去緩存服務器中查找對應 key 的緩存值,如果找到緩存值,那么 Spring 將不會再調用方法,而是將緩存值讀出,返回給調用者;如果沒有找到緩存值,那么 Spring 就會執行你的方法,將最后的結果通過 key 保存到緩存服務器中
@CachePutSpring 會將該方法返回的值緩存到緩存服務器中,這里簡要注意的是, Spring 不會事先去緩存服務器中查找,而是直接執行方法,然后緩存。換句話說,該方法始終會被 Spring 所調用
@CacheEvict移除緩存對應的 key 的值
@Caching這是一個分組注解,它能夠同時應用于其他緩存的注解
  • 注解@Cacheable 和@CachePut 都可以保存緩存鍵值對,只是它們的方式略有不同, 請注意二者的區別,它們只能運用于有返回值的方法中
  • 而刪除緩存 key 的@CacheEvict 則可以用在 void 的方法上,因為它并不需要去保存任何值 。
  • 上述注解都能標注到類或者方法之上,如果放到類上,則對所有的方法都有效,如果放到方法上,則只是對方法有效。
  • 在大部分情況下,會放置到方法上。 @Cacheable 和 @CachePut 可以配置的屬性接近。
  • 一般而言,對于查詢,我們會考慮使用@Cacheable
  • 對于插入和修改,考慮使用@CachePut
  • 對于刪除操作,我們會考慮使用@CacheEvict。

注解@Cacheable 和@CachePut

因為@Cacheable 和@CachePut 兩個注解的配置項 比較接近,所以這里就將這兩個注解一并來看

屬性配置類型說明
valueString[]使用緩存的名稱
conditionStringSpring 表達式,如果表達式返回值為 false,則不會將緩存應用到方法上, true 則會
keyStringSpring 表達式,可以通過它來計算對應緩存的 key
unlessStringSpring 表達式,如果表達式返回值為 true,則不會將方法的結果放到緩存上

value 和 key 這兩個屬性使用得最多,所以先來討論這兩個屬性。

value 是一個數組,可以引用多個緩存管理器.

案例----->https://blog.csdn.net/yangshangwei/article/details/82961772#Service_664

如上代碼所示定義redisCacheManager后就可以引用它了,而對于 key 則是緩存中的鍵,它支持 Spring 表達式,通過 Spring 表達式就可以自定義緩存的 key。


表達式值的引用

Spring 表達式和緩存注解之間的約定,通過這些約定去引用方法的參數和返回值的內容,使得其注入 key 所定義的 Spring 表達式的結果中。

表達式描述備注
#root.args定義傳遞給緩存方法的參數不常用,暫不討論
#root.caches該方法執行是對應的緩存名稱,它是一個數組不常用,暫不討論
#root.target執行緩存的目標對象不常用,暫不討論
#root.targetClass目標對象的類,它是#root.target.class 的縮寫不常用,暫不討論
#root.method緩存方法不常用,暫不討論
#root.methodName緩存方法的名稱,它是#root.method.name 的縮寫不常用,暫不討論
#result方法返回結果值,還可以使用 Spring 表達式進一步讀取其屬性請注意該表達式不能用于注解@Cacheable,因為該注解的方法可能不會被執行,這樣返回值就無從談起了
#Argument任意方法的參數,可以通過方法本身的名稱或者下標去定義比如 getRole(Long id)方法,想讀取 id 這個參數,可以寫為#id,或者#a0、#p0,建議寫為#id,可讀性高

這樣就方便使用對應的參數或者返回值作為緩存的 key 了。


注解@CacheEvict

注解@CacheEvict 主要是為了移除緩存對應的鍵值對,主要對于那些刪除的操作,先來了解它存在哪些屬性。

屬性配置類型說明
valueString[]要使用緩存的名稱
keyStringSpring 表達式,可以通過它來計算對應緩存的 key
conditionStringSpring 表達式,如果表達式返回值為 false,則不會將緩存應用到方法上, true 則會
allEntriesboolean如果為 true,則刪除特定緩存所有鍵值對,默認值為 false,請注意它將消除所有緩存服務器的緩存,這個屬性慎用
beforelnvocationboolean指定在方法前后移除緩存,如果指定為 true,則在方法前刪除緩存:如果為 false,則在方法調用后刪除級存,默認值為 false
  • value 和 key 與之前的@Cacheable 和@CachePut 是一致的。
  • 屬性 allEntries 要求刪除緩存服務器中所有的緩存,這個時候指定的 key 將不會生效,所以這個屬性要慎用
  • beforeInvocation 屬性指定緩存在方法前或者方法后移除。

案例

Spring緩存機制整合Redis

package com.artisan.ssm_redis.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;import com.artisan.ssm_redis.dao.RoleDao; import com.artisan.ssm_redis.domain.Role; import com.artisan.ssm_redis.service.RoleService;@Service public class RoleServiceImpl implements RoleService {// 自動注入@Autowiredprivate RoleDao roleDao;/*** 使用@Cacheable定義緩存策略 當緩存中有值,則返回緩存數據,否則訪問方法得到數據 通過value引用緩存管理器,通過key定義鍵* * @param id* 角色編號* @return 角色*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@Cacheable(value = "redisCacheManager", key = "'redis_role_'+#id")public Role getRole(Long id) {return roleDao.getRole(id);}/*** 使用@CachePut則表示無論如何都會執行方法,最后將方法的返回值再保存到緩存中* 使用在插入數據的地方,則表示保存到數據庫后,會同期插入到Redis緩存中* * @param role* 角色對象* @return 角色對象(會回填主鍵)*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@CachePut(value = "redisCacheManager", key = "'redis_role_'+#result.id")public Role insertRole(Role role) {roleDao.insertRole(role);return role;}/*** 使用@CachePut,表示更新數據庫數據的同時,也會同步更新緩存* * @param role* 角色對象* @return 影響條數*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@CachePut(value = "redisCacheManager", key = "'redis_role_'+#role.id")public int updateRole(Role role) {return roleDao.updateRole(role);}/*** 使用@CacheEvict刪除緩存對應的key* * @param id* 角色編號* @return 返回刪除記錄數*/@Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)@CacheEvict(value = "redisCacheManager", key = "'redis_role_'+#id")public int deleteRole(Long id) {return roleDao.deleteRole(id);}}

總結

以上是生活随笔為你收集整理的Spring Cache-缓存注解(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。