Redis:@Cacheable、@CachePut、@CacheEvict

MySQL+Redis使用更簡單的辦法就是使用Spring的Cache註解包(spring-boot-starter-cache) 只需要幾個註解就能完成一大堆要處理的邏輯

使用時需要在啓動類上添加註解 @EnableCaching 來開啓使用

@Cacheable
@Cacheable可以標記在一個方法上,也可以標記在一個類上。當標記在一個方法上時表示該方法是支持緩存的,當標記在一個類上時則表示該類所有的方法都是支持緩存的。對於一個支持緩存的方法,Spring會在其被調用後將其返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法。Spring在緩存方法的返回值時是以鍵值對進行緩存的,值就是方法的返回結果,至於鍵的話,Spring又支持兩種策略,默認策略和自定義策略,這個稍後會進行說明。需要注意的是當一個支持緩存的方法在對象內部被調用時是不會觸發緩存功能的

@CachePut
在支持Spring Cache的環境下,對於使用@Cacheable標註的方法,Spring在每次執行前都會檢查Cache中是否存在相同key的緩存元素,如果存在就不再執行該方法,而是直接從緩存中獲取結果進行返回,否則纔會執行並將返回結果存入指定的緩存中。@CachePut也可以聲明一個方法支持緩存功能。與@Cacheable不同的是使用@CachePut標註的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的緩存中。

@CacheEvict
@CacheEvict是用來標註在需要清除緩存元素的方法或類上的。當標記在一個類上時表示其中所有的方法的執行都會觸發緩存的清除操作。@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語義與@Cacheable對應的屬性類似。即value表示清除操作是發生在哪些Cache上的(對應Cache的名稱);key表示需要清除的是哪個key,如未指定則會使用默認策略生成的key;condition表示清除操作發生的條件。

@Caching
@Caching註解可以讓我們在一個方法或者類上同時指定多個Spring Cache相關的註解。其擁有三個屬性:cacheable、put和evict,分別用於指定@Cacheable、@CachePut和@CacheEvict。

@CacheConfig
所有的@Cacheable裏面都有一個value=“xxx”的屬性,這顯然如果方法多了,寫起來也是挺累的,使用@CacheConfig(cacheNames = “User:Info”)可以一次性聲明

注意:緩存的 key,可以爲空,如果指定要按照 SpEL 表達式編寫,如果不指定,則缺省按照方法的所有參數進行組合

下面上個使用示例 

@Service
//這裏的CacheConfig用來統一配置一下緩存的名字前綴 本示例中在Redis裏面的key會像User:Info::xxxxxx 這樣
@CacheConfig(cacheNames = "User:Info")
public class UserServiceImpl implements UserService {

   //這裏的Cacheable用來獲取緩存信息 會在其被調用後將其返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法中查詢邏輯
    @Cacheable(key = "#fromUin", unless = "#result == null")
    public UserEntity getUserInfo(String fromUin) {
        return Objects.requireNonNull(userRepository.findById(fromUin).orElse(null), "用戶不存在");
    }

	//這裏的CachePut用來在修改個人信息時更新緩存的用戶信息
    @CachePut(key = "#userEntity.fromUin")
    public UserEntity serUserInfo(UserEntity userEntity){
		//.....
	}

	//這裏的CacheEvict是用來刪除緩存的用戶信息 免得沒用的數據佔用Redis存儲空間
	@CacheEvict(key = "#userEntity.fromUin")
    public UserEntity deleteUserInfo(UserEntity userEntity){
		//.....
	}
}

如上面示例 就完成了數據結果緩存 減少的數據庫的查詢 代碼簡潔方便 不用手動擼一大堆判斷咯 其他的細節信息可以查閱官方文檔 這裏懶得寫咯。

記得使用時需要在啓動類上添加註解 @EnableCaching 來開啓使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章