目录
一个系统的瓶颈通常发生在与数据库交互的过程中。内存速度远远快于硬盘速度。
14.1 Spring Cache简介
spring-context包中定义了org.springframework.cache.CacheManager和org.springframework.cache.Cache接口用来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口,Cache接口包含缓存的操作:增加、删除、读取等。
针对不同缓存技术,需要实现不同的CacheManager。
Spring支持的常用CacheManager | |
CacheManager | 描述 |
SimpleCacheManager | 使用简单的Collection来存储缓存 |
ConcurrentMapCacheManager | 使用java.util.concurrent.Concurrent.ConcurrentHashMap实现的Cache |
NoOpCacheManager | 仅测试用,不会实际存储缓存 |
EhCacheCacheManager | 集成使用EhCache缓存技术。EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,也是Java领域应用最为广泛的缓存 |
JCacheCacheManager | 支持JCache(JSR-107)标准的实现作为缓存技术,如Apache Commons JCS |
CaffeineCacheManager | 使用Caffeine作为缓存技术。Caffeine是使用Java 8对Guava缓存的重写版本,在Spring Boot 2.0中将取代Guava。如果出现Caffeine,CaffeineCacheManager将会自动配置。使用spring.cache.cache-names属性可以在启动时创建缓存 |
CompositeCacheManager | 用于组合CacheManager,即可以从多个CacheManager中轮询得到相应的缓存 |
Spring Cache使用的核心思想:当调用一个缓存方法时,会把该方法的参数和返回结果作为一个键值对存在缓存中,当下次使用该方法时,直接调用缓存而不是调用方法。
14.2 Cache注解
14.2.1 @Cacheable
1.使用:针对方法配置。缓存存在,直接读取缓存值;缓存不存在,调用方法
2.属性
1)value:缓存名(必填)
2)key:可使用SPEL标签自定义缓存key(可选)
3)condition:指定发生条件(可选)
14.2.2 @CachePut
1.使用:针对方法配置,根据方法的请求参数对结果进行缓存,会触发真实方法调用
2.属性
1)value:缓存名(必填)
2)key:可使用SPEL标签自定义缓存key(可选)
14.2.3 @CacheEvict
1.使用:针对方法配置,根据一定条件清空对应缓存
2.属性
1)value:缓存名(必填)
2)key:可使用SPEL标签自定义缓存key(可选)
3)condition:指定缓存条件(可选)
4)allEntries:是否清空所有缓存(可选,默认为false)
5)beforeInvocation:是否在方法执行前清空(可选,默认false,当执行发生异常时则不清空)
14.2.4 @Caching
1.使用:组合使用其他注解,可组合相同注解,也可组合不同注解
2.例子:@Caching(evict={@CacheEvict("u1"),@CacheEvict("u2",allEntries=true)})
14.3 项目实战
1.创建项目
2.添加依赖
dependencies {
compile('org.springframework.boot:spring-boot-starter-cache')
}
3.数据库配置(MySQL)
1)在项目中添加依赖
runtime('mysql:mysql-connector-java')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
2)在数据库中创建schema
create schema 'demo_cache' default character set utf-8
3)在application.properties中配置数据库连接信息
spring.datasource.url=jabc:mysql://localhost:3306/demo_cache?useUnicode=true&characterEncoding=UTF8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.driverClassName
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySql5Dialect
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNameingStrategy
4)实体类
5)数据访问层
6)业务层:通常在业务逻辑层使用缓存服务
7)控制层
8)在启动类中,使用@EnableCaching,启用Cache功能