背景:系統使用shiro作權限控制,每次調用須要權限的方法時會查詢數據庫獲取該用戶的角色進行對比,此查詢的頻率大於更新頻率,因此使用緩存進行優化html
配置:redis
# application.yamlspring
spring: redis: host: redis ip地址 port: redis 端口 cache: type: redis
1.、使用 @EnableCaching 開啓緩存數據庫
2.、使用 @Cacheable 註解 給查找全部角色名稱方法添加緩存緩存
@Cacheable(value = "roles", key = "T(String).valueOf(#userId)", unless = "#result eq null ") public Collection<String> selectRoleNamesByUserId(Integer userId) { return userRoleMapper.selectRoleNames(userId); }
3.、使用 @CacheEvict 註解 刪除緩存(當數據庫中的數據進行更新時)app
@CacheEvict(value = "roles", key = "T(String).valueOf(#userId)") public void updateRoleByUserIdAndRoleId(Long userId, Long roleId) {
// 如下爲業務邏輯,大概意思爲更新了數據庫中的角色用戶關聯數據 if(roleId.equals(Constant.USER_ROLE_ID)){ userRoleMapper.updateDriverToUser(userId, Constant.USER_ROLE_ID, Constant.DRIVER_ROLE_ID); }else if(roleId.equals(Constant.DRIVER_ROLE_ID)){ userRoleMapper.updateUserToDriver(userId, Constant.USER_ROLE_ID, Constant.DRIVER_ROLE_ID); } }
@Cacheable註解詳解:less
註解描述:優化
* 代表調用一個方法(或全部方法的結果【註解在類上】)能夠被緩存spa
* 每次調用該註解註解的方法時,都會應用緩存行爲,默認的key【key值爲從緩存中取該緩存value的key】使用方法參數計算祕鑰,能夠經過該註解的key屬性替換默認值code
* 若是在緩存中找不到該key值,則該目標的方法會進行調用【就是執行方法體】,將返回的值存儲在緩存中。
經常使用屬性描述:
value: 緩存的名稱
key: 緩存的key,能夠爲空,若是指定要按照SpEL表達式編寫,若是不指定,則缺省按照方法的全部參數進行組合
condition: 緩存的條件,能夠爲空,使用SpEL編寫,返回爲true或false,只有true才進行緩存
unless: 否認緩存,當條件爲true時就不會緩存
@CacheEvict註解詳解
* 表示方法(或類中的全部方法)執行時根據key值觸發緩存清空操做
屬性描述
allEntries: 表示是否須要清除緩存中的全部元素,默認爲false,若是爲true,將忽略該註解指定的key。【將緩存中的元素所有清空,比一個一個清空更加有效】
beforeInvocation: 清除操做默認是在對應方法成功以後觸發的,即方法若是由於拋出異常而未能成功返回時不會觸發清除操做。使用beforeInvocation能夠改變觸發清除操做的時間,當咱們指定該屬性值爲true時,Spring會在調用該方法以前清除緩存中的指定元素。
以上三個註解完成了個人需求,其他跟緩存相關注解用到後再添加
【推薦一篇好的博文】http://www.javashuo.com/article/p-gxtfjczx-dg.html