面向小白的SpringBoot的缓存抽象

110 阅读2分钟

这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

昨天介绍了Redis集群,但是Spring也是有自己的缓存抽象的,其原理是基于AOP的,如果我们平时缓存的话也可以参考噢。

那什么时候用JVM缓存,什么时候用分布式缓存呢?其实还是由实际的业务决定的,如果一个数据,读一次,写一次,那没必要做缓存,因为缓存失效的太快了,但是你像秒杀的商品啊,那就都是读,改的情况非常小,而且不同实例获取的商品得是一样的,就是说得保证数据的一致性,这种时候用分布式缓存就比较有作用了。

但如果你的数据是那种基本不怎么改,而且呢又不要求很强的数据一致性的话,那可以考虑使用JVM缓存,比如缓存用户数据了,啥的,用来查询都是可以的。

缓存注解

  • EnableCaching开启缓存管理。检查方法上是否存在缓存注解,并对其进行相应处理。
  • Cacheable使用缓存,如果缓存里面有数据,就去里面拿,没有就执行方法,放入缓存
  • CacheEvict缓存清除,标记在类上就是当类中方法执行了,就清除缓存,一般删除和修改中使用,也可可指定key删除缓存。
  • CachePut不管方法曾经是否缓存,都执行该方法,并存入缓存
  • Caching 可以指定一个或多个缓存的注解,相当于是对缓存进行打包,可以做多个操作
  • CacheConfig进行一些缓存的配置

搞代码

我们可以写点代码验证一下,开启缓存管理:

@EnableCaching(proxyTargetClass = true)
public class SpringBucksApplication implements ApplicationRunner {

统一指定缓存key

@CacheConfig(cacheNames = "key")

查询放数据

@Cacheable
public List<Coffee> findAllCoffee() {
    return coffeeRepository.findAll();
}

重新加载删除缓存

@CacheEvict
public void reloadCoffee() {
}

运行结果

结果如下: 查询 image.png

取缓存

image.png

缓存删除

image.png

再查就走数据库了。