@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。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: