缓存可以提高系统的访问速度,提升系统的性能
JSR-107
Java Caching 定义了5个核心接口
- CachingProvider:管理和控制着多个CacheManager
- CacheManager:管理和控制多个唯一命名的Cache
- Cache:缓存组件,类似Map有key作为索引
- Entry:Cache中的value值
- Expiry:Cache的有效期限
Spring缓存抽象
保留了CacheManager和Cache
注解 | 说明 |
---|---|
@Cacheable | 可根据方法的参数对返回结果进行缓存 |
@CacheEvict | 清空缓存 |
@CachePut | 更新缓存 |
@EnableCaching | 开启基于注解的缓存 |
实际操作
环境搭建
未完整说明
- 使用idea的spring initialize创建项目选择 Cache,Mysql,Mabatis 和 Web 模块
- 创建数据库以及表
- 创建数据库表对应的实体类
- 配置 application.propreties,注意url中要添加时区 serverTimezone=UTC,驱动可省略不写。
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 使用的是Mabatis所以在主程序中用 @MapperScan() 注解,括号中的value值说明要扫描的mapper接口所在的包的全类名
- 创建mapper包,用 @Mapper 注解对应创建实体类的mapper接口,方法上使用 @Select,@Update,@Insert,@Delete 注解
- 创建Service和Controller层分别使用 @Service 和 @Controller 注解
- 编写对应代码并测试
测试缓存
- 主程序加上 @EnableCaching 开启缓存
- Service对应方法上加上 @Cacheable
@Cacheable中对应的属性:
- cacheNames/value:指定缓存的名字
- key:缓存数据使用的索引,默认使用方法的参数作为值。可以使用SpEL表达式,如*#root.args[0]*指定key的值
- keyGenerator:key的生成器,可以指定生成器。与key二选一使用。在使用keyGenerator时可以自定义一个keyGenerator来替换SpringBoot中默认使用的keyGenerator
@Configuration
public class MyKeyGenerator implements KeyGenerator{
@Override
public Object generate(Object o, Method method, Object... objects) {
return 1; //生成的key的值
}
}
- cacheManager:指定缓存管理器
- condition:符合条件的情况下进行缓存(使用SpEL表达式)
- unless:符合条件不进行缓存,可获得方法返回结果判断(使用SpEL表达式)
- 更新缓存 @CachePut,要注意的是在使用 @CachePut 注解时,是先执行方法在获得key的值,而 @Cacheable 是先获得key的值。另外要保证 @CachePut 和 @Cacheable 的key值相等,才能同步更新缓存
- 删除缓存 @CacheEvict 中的属性
- allEntries:等于true时删除所有缓存
- beforeInvocation:等于true时,在方法执行之前删除所有缓存,避免了方法中出现异常而导致缓存没有删除
- @Caching 可以制定复杂的缓存规则,包括了 @Cacheable、@CachePut 和 @CacheEvict 的功能
- @CacheConfig 在类上标注,指定全局缓存规则
整合Redis
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置连接
spring.redis.host=127.0.0.1
spring.redis.port=6379
3、自定义RedisTemplate和RedisUtil
- RedisTemplate 主要实现序列化的功能
- RedisUtil 封装,集成了对redis的原生操作