@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 進行 模糊刪除,發(fā)現 @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 的序列化問題
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。