1.Spring Boot 使用 Cache
我们知道一个程序的瓶颈在于数据库,我们也知道内存的速度是远大于硬盘的速度的。当我们需要重复地获取相同的数据的时候,我们一次又一次的请求数据库或远程服务,导致大量的时间耗费在数据库查询或者远程方法调用上,导致程序性能的恶化,这便是数据缓存要解决的问题。
1.1 Spring 缓存支持
Spring 定义了 org.springframework.cache.CacheManager 和 org.springframework.cache.Cache 接口用来统一不同的缓存的技术。其中,CacheManager 是 Spring 提供的各种缓存技术抽象接口, Cache 接口包含缓存的各种操作(增加,删除,获得缓存,我们一般不会直接和此接口打交道)。
1.2 Spring 支持的 CacheManager
针对不同的缓存技术,需要实现不同的 CacheManage ,Spring 定义了如下所示的 CacheManager 实现。
CacheManager | 描述 |
---|---|
SimpleCacheManager | 使用简单的 Collection 来存储缓存,主要用来测试用途 |
ConcurrentMapCacheManager | 使用 ConcurrentMap 来存储缓存 |
NoOpCacheManager | 仅测试用途,不会实际存储缓存 |
EhCacheManager | 使用 EhCache 作为缓存技术 |
GuavaCacheManager | 使用 Google Guava 的 GuavaCache 作为缓存技术 |
HazelcastCacheManager | 使用 Hazelcast 作为缓存技术 |
JCacheCacheManager | 支持 JCache(JSR-107)标准的实现作为缓存技术,如 Apache Commons JCS |
RedisCacheManager | 使用 Redis 作为缓存技术 |
1.3 声明式缓存
Spring 提供了4个注解来声明缓存规则。这四个注解如下:
注解 | 解释 |
---|---|
@Cacheable | 在方法执行前 Spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有,调用方法并将方法返回值放进缓存 |
@CachePut | 一定会调用方法,并将方法返回值放到缓存中,@CachePut 的属性和 @Cacheable 保持一致 |
@CacheEvict | 将一条或者多条数据从换从中删除 |
@Caching | 可以通过 @Caching 注解组合多个注解策略放在一个方法上 |
@Cacheable,@CachePut,@CacheEvict 都有 value 属性,指定的是要使用的缓存名称;key 属性指定的是数据在缓存中的存储的键。
1.4 开启声明式缓存支持
开启声明式缓存支持十分简单,只需在配置类上使用 @EnableCaching 注解即可,如:
@SpringBootApplication
@EnableCaching
public class SpringBootDemoMybatiesApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoMybatiesApplication.class, args);
}
}
1.5 Spring Boot 的支持
在 Spring 中使用缓存技术的关键是配置 CacheManager,而 Spring Boot 为我们自动配置了多个 CacheManager 的实现。
在不做任何额外的配置的情况下,默认使用的是 SimpleCacheConf