背景:系统使用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