springboot+ehcache缓存遇到的坑

springboot+ehcache使用方法:

1.在src/main/resource里面配置ehcache.xml

2.在配置文件application.properties里引入echcache.xml

spring.cache.ehcache.config=classpath:ehcache.xml

3.在springboot启动类里加上ehcache注解

4.在controller层里直接调用的service层方法上加入ehcache注解,实体类必须实现

implements Serializable 序列化

@CacheEvict必须作用在走代理的方法上,controller层直接调用service层的方法,不能在方法调用的方法上加入注解,否则注解无效

1.使用@Cacheable把数据存进缓存,下面就是专门把方法返回值存入缓存

@Service

@Transactional     //事务,表示该类下所有的都受事务控制

public class userServiceImpl implements userService {

    @Autowired

    private userMapper usermapper;

    @Override

    @Cacheable(value="users")

    public user selectUserById(int id) {

        user user=this.usermapper.selectUserById(id);

        System.out.println("1111111111111111111111111");

        return user;

    }

 

}

说明:1》@Cacheable可以标记在一个方法上,也可以标记在一个类上,当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果。

2》@Cacheable可以指定三个属性,value、key和condition。 value属性指定cache的名称(即选择ehcache.xml中哪种缓存方式存储)key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。我们也直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例

@Cacheable(value="users", key="#id")

public User find(Integer id) {

   return null;

}

@Cacheable(value="users", key="#p0")

public User find(Integer id) {

   retur nnull;

}

@Cacheable(value="users", key="#user.id")

public User find(User user) {

   retur nnull;

}

@Cacheable(value="users", key="#p0.id")

public User find(User user) {

   returnnull;

}

3》最后,使用@CacheEvict清除缓存;

@CacheEvict(value="users",allEntries=true)

public void saveUsers(Users users) {

this.usersRepository.save(users);

}

说明:@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。 其中value、key和condition的语义与@Cacheable对应的属性类似;allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

@CachePut 的作用 主要针对方法配置,如果缓存需要更新,且不干扰方法的执行,可以使用注解@CachePut。@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor)
清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素

@CacheEvict(cacheNames="books", beforeInvocation=true)
public void loadBooks(InputStream batch)
说明:

@Cacheable,@CachePut , @CacheEvict都有value属性,指定的是要使用缓存名称;key属性指定的是数据在缓存中的存储的键。@Cacheable(“something");这个相当于save()操作,@cachePut相当于Update()操作,只要他标示的方法被调用,那么都会缓存起来,而@Cacheable则是先看下有没已经缓存了,然后再选择是否执行方法。@CacheEvict相当于Delete()操作。用来清除缓存用的。
 

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值