@Cacheable 作用和配置方法
属性 | 配置类型 | 描述 |
---|---|---|
value | String[] | 缓存的名称,缓存中具体哪个数据库,在 spring 配置文件中定义,必须指定至少一个 |
key | String | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合,或者方法参数列表中的任意一个参数,或者字符串+参数组合 |
condition | String | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存,condition对传入值生效 |
unless | String | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 false才进行缓存,unless对结果result生效 |
例子代码
/**
* 1.注解的condition和unless的区别,condition对传入值生效,unless对结果result生效,使用了错误的result导致报空错误
* 2.key键生成策略,不能再key中直接调用工具类的方法,将方法写在同一个类下,使用#root.target.methodName(#p0.attributeName)对属性值进行操作,最佳解决方案:使用自定义key策略,将参数转为带操作的对象,返回key
* 3.属性与NULL比较时,null 写在前面 ,null eq object
*/
@Cacheable(value = "redisCacheManager", key = "'redis_role_'+#id", unless="null eq #result")
public Role getRole(Long id) {
return roleDao.getRole(id);
}
@CachePut 作用和配置方法
与Cacheable 相同,只是流程上面不同。
- CachePut 先执行函数体,然后将内容缓存到redis上面,适用于update、insert
- Cacheable 先查询缓存,不存在再执行函数体,然后将返回内容缓存到redis中
例子代码
// 这里为了测试返回值写法,所有写的别扭
@CachePut(value = "redisCacheManager", key = "'redis_role_'+#result.id")
public Role insertRole(Role role) {
roleDao.insertRole(role);
return role;
}
@CachePut(value = "redisCacheManager", key = "'redis_role_'+#role.id")
public int updateRole(Role role) {
return roleDao.updateRole(role);
}
@CacheEvict 作用和配置方法
例子代码
@CacheEvict(value = "redisCacheManager", key = "'redis_role_'+#id")
public int deleteRole(Long id) {
return roleDao.deleteRole(id);
}