导读


为了缓解数据库压力,目前大多使用的是Redis缓存,下面简单介绍下使用Redis缓存注解开发。

使用


有以下几个注解。

注解@Cacheable

@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存。

源码如下:

  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Inherited
  4. @Documented
  5. public @interface Cacheable {
  6. @AliasFor("cacheNames")
  7. String[] value() default {};
  8. @AliasFor("value")
  9. String[] cacheNames() default {};
  10. String key() default "";
  11. String keyGenerator() default "";
  12. String cacheManager() default "";
  13. String cacheResolver() default "";
  14. String condition() default "";
  15. String unless() default "";
  16. boolean sync() default false;
  17. }

参数解释:

  • value :缓存的名称,在 spring 配置文件中定义,必须指定至少一个。
  • key :缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。
  • condition :缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。
  • unless :函数返回值符合表达式条件的,veto(否决)、不缓存。

栗子:

  1. //解释--缓存的名字叫userCache,key使用User对象的getId方法,如果结果为空或者获取的值不存在,不缓存
  2. @Cacheable(value = "userCache", key = "#user.getId()",
  3. unless = "#result==null||#result.size()<=0")
  4. public List<UserVO> getTiaoXianList(User user) {
  5. //省略逻辑
  6. return list;
  7. }
  8. public User class{
  9. public int getId(){
  10. return Math.random();
  11. }
  12. }

注解@CacheEvict

@CacheEvict : 主要针对方法配置,能够根据一定的条件对缓存进行清空。

在我有个业务需求,执行某个方法,需要删除两个key缓存,采用@CacheEvict
image.png

注解@CachePut

@CachePut :对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用。

使用CachePut注解,该方法每次都会执行,会清除对应的key值得缓存(或者更新),分为以下两种情况:

  • 如果返回值null,下次进行该key值查询时,还会查一次数据库,此时相当于@CacheEvict注解;
  • 如果返回值不为null,此时会进行该key值缓存的更新,更新缓存值为返回的数据;

栗子:

  1. @CachePut(value="GetUserInfo",key="#user.getId()")
  2. //@CacheEvict(value="GetUserInfo",key="#user.getId()")//清除数据
  3. public User update(User user) {
  4. userMapper.updateByPrimaryKeySelective(user);
  5. //return userMapper.selectByPrimaryKey(user.getId());
  6. return null;

END


参考: