Springboot 中缓存的使用
一。说明
1.springboot 中的缓存遵循 JSR107 规范。
2.spring 中 从 3.1 版本开始,实现了 JSR107规范,进行了缓存的抽象。
3.springboot 中提供了几个方便的注解用来处理缓存,如@Cacheable ,@CacheEvict等。
4.如果不设置缓存类型,默认情况下,会缓存到 JVM中 ,以ConcurrentHashMap 的方式进行缓存。
5.springboot中使用缓存,不引入 spring-boot-starter-cache依赖也可以正常使用。
二。springboot中使用缓存(redis)
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
2.在 application.yml 中指定 缓存方式
如果是多环境的话,可以在 application.yml 中指定
spring:
cache:
type: redis
3.在 application.yml 中指定 redis 连接信息
如果是多环境的话,可以在 application-dev.yml 中指定
spring:
redis:
host: 127.0.0.1
port: 6379
password: my_password_123456
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 500
min-idle: 0
lettuce:
shutdown-timeout: 0
database: 1
4.在启动类上开启缓存
@EnableCaching
5.注解的使用
说明
实际在使用业务缓存的时候,key的形式一般是 缓存前缀+业务id。缓存前缀用来表示是哪类业务,而id 表示是哪个业务数据。这种分类存储的方式使整体存储的数据结构更清晰。比如 student::2001,表示学号为1的学生;employee::6001,表示工号为 6001 的员工。
cacheNames 的值实际上就是缓存前缀,key 的值就是 业务id。
1.读取缓存
@Cacheable
如果缓存不存在,则先执行一遍查询数据的逻辑,然后添加到缓存
2.更新缓存
@CachePut
注意:更新的缓存的值,是return的值,所以,即使是insert/update操作,在最后也要return。
3.删除缓存
@CacheEvict
注意:beforeInvocation 参数 表示 是否在执行方法的方法体之前删除缓存,beforeInvocation = true 表示是在执行方法体之前删除缓存。
三。缓存不生效问题的解决
如果设置了缓存,但是缓存不生效。可以检查以下几个地方:
(1)是否在 application.yml 中设置了缓存类型
(2)是否在启动类上开启了缓存
(3)如果缓存的是对象的话,对象应该进行序列化。
(4)被直接调用的普通方法上添加注解不生效,如下:
定义方法 getValue ,并添加 注解
此时show方法中直接调用的 getValue方法
这时如果在postman中请求 /show,是不会向redis中添加缓存的,如图: