缓存的框架太多了,各有各的优势,比如Redis、Memcached、Guava、Caffeine等等。
如果我们的程序想要使用缓存,就要与这些框架耦合。聪明的架构师已经在利用接口来降低耦合了,利用面向对象的抽象和多态的特性,做到业务代码与具体的框架分离。
但我们仍然需要显式地在代码中去调用与缓存有关的接口和方法,在合适的时候插入数据到缓存里,在合适的时候从缓存中读取数据。
想一想AOP的适用场景,这不就是天生就应该AOP去做的吗?
是的,Spring Cache就是一个这个框架。它利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了。而且Spring Cache也提供了很多默认的配置,用户可以3秒钟就使用上一个很不错的缓存功能。
一、什么是Spring Boot Cache?
Spring Cache本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用Spring Cache还需要具体的缓存实现来完成。
Spring Boot 集成了多种cache的实现,如果你没有在配置类中声明CacheManager或者CacheResolvoer,那么SpringBoot会按顺序在下面的实现类中寻找:
-
每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
-
使用Spring缓存抽象时我们需要关注以下两点;
1、确定方法需要被缓存以及他们的缓存策略
2、从缓存中读取之前缓存存储的数据
二、简单使用SpringCache
分为很简单的三步:加依赖,开启缓存,加缓存注解。
1) 加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2 )开启缓存
在启动类加上@EnableCaching
注解即可开启使用缓存。
@SpringBootApplication
@EnableCaching
public class CachingApplication {public static void main(String[] args) {SpringApplication.run(CachingApplication.class, args);}}
3)加缓存注解
在要缓存的方法上面添加@Cacheable
注解,即可缓存这个方法的返回值。
@Cacheable(value = "emp" ,key = "targetClass + methodName +#p0")public List<NewJob> queryAll(User uid) {return newJobDao.findAllByUid(uid);}
此处的value
是必需的,它指定了你的缓存存放在哪块命名空间。
此处的key
是使用的spEL表达式,参考上章。这里有一个小坑,如果你把methodName
换成method
运行会报错,观察它们的返回类型,原因在于methodName
是String
而methoh
是Method
。
此处的User
实体类一定要实现序列化public class User implements Serializable
,否则会报java.io.NotSerializableException
异常。
需要注意的是,调用加了@Cacheable 的方法,调用方法必须跟加了@Cacheable 的方法 在不同的类中,跟反向代理有关,不然不会生效。