@CacheEvict 清除多個key的實現方式
借用@Caching實現
入參是基本類型的:
@Caching(evict={@CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId"), @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleId"), @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId")}) public ResponseData remove(@RequestParam Long roleId) { ……………… }
入參是對象的:
@Caching(evict={@CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleDto.roleId"), @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleDto.roleId"), @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleDto.roleId")}) public ResponseData edit(RoleDto roleDto) { this.roleService.editRole(roleDto); return SUCCESS_TIP; }
補充:@CacheEvict 模糊刪除緩存問題-RedisTemplate 模糊key刪除緩存
緩存管理使用註解形式,非常方便瞭我們的使用,然而今天我想 使用 @CacheEvict 的實和key 進行 模糊刪除,發現 @CacheEvict 貌似不支持這樣的操作,然後想起 RedisTemplate 好像支持 key的模糊匹配。
於是,方法有瞭
既然@CacheEvict做不到,那就用 RedisTemplate
第一步:
獲取key
這裡的key就是 : user:role* 這樣的
Set<Object,Object> keys = redisTemplate.keys( key );
第二步:
判斷 keys 非空,然後進行刪除
if (CollectionUtils.isNotEmpty(keys)) { redisTemplate.delete(keys); }
總結:
刪除緩存的時候,如果 keys 是空的,則沒有反應,因為查看源碼可知,redisTemplate 幫你判斷瞭,如果是 空的則 return
此處也有可能刪不掉,刪不掉很可能就是 key 的序列化問題
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Spring @Cacheable註解中key的使用詳解
- Spring緩存註解@Cacheable @CacheEvit @CachePut使用介紹
- Java SpringCache+Redis緩存數據詳解
- SpringBoot2.X整合Spring-Cache緩存開發的實現
- mybatis如何使用註解實現一對多關聯查詢