导读
为了缓解数据库压力,目前大多使用的是Redis缓存,下面简单介绍下使用Redis缓存注解开发。
使用
注解@Cacheable
@Cacheable
的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存。
源码如下:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
String key() default "";
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
String condition() default "";
String unless() default "";
boolean sync() default false;
}
参数解释:
value
:缓存的名称,在 spring 配置文件中定义,必须指定至少一个。key
:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。condition
:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。unless
:函数返回值符合表达式条件的,veto(否决)、不缓存。
栗子:
//解释--缓存的名字叫userCache,key使用User对象的getId方法,如果结果为空或者获取的值不存在,不缓存
@Cacheable(value = "userCache", key = "#user.getId()",
unless = "#result==null||#result.size()<=0")
public List<UserVO> getTiaoXianList(User user) {
//省略逻辑
return list;
}
public User class{
public int getId(){
return Math.random();
}
}
注解@CacheEvict
@CacheEvict
: 主要针对方法配置,能够根据一定的条件对缓存进行清空。
在我有个业务需求,执行某个方法,需要删除两个key缓存,采用@CacheEvict
注解@CachePut
@CachePut
:对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable
不同的是,它每次都会触发真实方法的调用。
使用CachePut注解,该方法每次都会执行,会清除对应的key值得缓存(或者更新),分为以下两种情况:
- 如果返回值
null
,下次进行该key值查询时,还会查一次数据库,此时相当于@CacheEvict
注解; - 如果返回值不为
null
,此时会进行该key值缓存的更新,更新缓存值为返回的数据;
栗子:
@CachePut(value="GetUserInfo",key="#user.getId()")
//@CacheEvict(value="GetUserInfo",key="#user.getId()")//清除数据
public User update(User user) {
userMapper.updateByPrimaryKeySelective(user);
//return userMapper.selectByPrimaryKey(user.getId());
return null;
END
参考: