當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Cache-缓存注解(二)
生活随笔
收集整理的這篇文章主要介紹了
Spring Cache-缓存注解(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 導讀
- 概述
- 注解@Cacheable 和@CachePut
- 表達式值的引用
- 注解@CacheEvict
- 案例
導讀
Spring-Cache手札
Spring Cache抽象-緩存注解
實戰-Redis-20Spring緩存機制整合Redis
關于Spring Cache以及注解,之前總結了幾篇。現在我們再來細化下
概述
| @Cacheable | 表明在進入方法之前, Spring 會先去緩存服務器中查找對應 key 的緩存值,如果找到緩存值,那么 Spring 將不會再調用方法,而是將緩存值讀出,返回給調用者;如果沒有找到緩存值,那么 Spring 就會執行你的方法,將最后的結果通過 key 保存到緩存服務器中 |
| @CachePut | Spring 會將該方法返回的值緩存到緩存服務器中,這里簡要注意的是, Spring 不會事先去緩存服務器中查找,而是直接執行方法,然后緩存。換句話說,該方法始終會被 Spring 所調用 |
| @CacheEvict | 移除緩存對應的 key 的值 |
| @Caching | 這是一個分組注解,它能夠同時應用于其他緩存的注解 |
- 注解@Cacheable 和@CachePut 都可以保存緩存鍵值對,只是它們的方式略有不同, 請注意二者的區別,它們只能運用于有返回值的方法中。
- 而刪除緩存 key 的@CacheEvict 則可以用在 void 的方法上,因為它并不需要去保存任何值 。
- 上述注解都能標注到類或者方法之上,如果放到類上,則對所有的方法都有效,如果放到方法上,則只是對方法有效。
- 在大部分情況下,會放置到方法上。 @Cacheable 和 @CachePut 可以配置的屬性接近。
- 一般而言,對于查詢,我們會考慮使用@Cacheable
- 對于插入和修改,考慮使用@CachePut
- 對于刪除操作,我們會考慮使用@CacheEvict。
注解@Cacheable 和@CachePut
因為@Cacheable 和@CachePut 兩個注解的配置項 比較接近,所以這里就將這兩個注解一并來看
| value | String[] | 使用緩存的名稱 |
| condition | String | Spring 表達式,如果表達式返回值為 false,則不會將緩存應用到方法上, true 則會 |
| key | String | Spring 表達式,可以通過它來計算對應緩存的 key |
| unless | String | Spring 表達式,如果表達式返回值為 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 主要是為了移除緩存對應的鍵值對,主要對于那些刪除的操作,先來了解它存在哪些屬性。
| value | String[] | 要使用緩存的名稱 |
| key | String | Spring 表達式,可以通過它來計算對應緩存的 key |
| condition | String | Spring 表達式,如果表達式返回值為 false,則不會將緩存應用到方法上, true 則會 |
| allEntries | boolean | 如果為 true,則刪除特定緩存所有鍵值對,默認值為 false,請注意它將消除所有緩存服務器的緩存,這個屬性慎用 |
| beforelnvocation | boolean | 指定在方法前后移除緩存,如果指定為 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-缓存注解(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis-20Spring缓存机制整合
- 下一篇: 高并发-【抢红包案例】之一:SSM环境搭