Spring的缓存
Java在使用Cache
的时候,为了统一缓存的使用,J2EE
发布了JSR107
缓存规范。包括了主要的5个核心接口,包括cachingProvider
、cacheManager
等。具体可以查看JSR107
缓存规。
Spring的缓存抽象
Spring为了统一缓存的操作,使用org.springframework.cache
包下的的cacheManager
接口进行开发。并支持上面所说的JSR107
缓存规范,用来简化开发。
Spring支持透明的向应用中的方法添加缓存。将查询出的信息放到缓存里,减少应用与实际数据库的查询次数。提高系统相应速度。
SpringBoot开启缓存注解
SpringBoot是默认支持Cache相关基础组件的。需要在启动器类上标注@EnableCaching
注解。如:
1 |
|
添加缓存,只需要在方法上添加注解,Spring cache
就能够帮助创建缓存。如:
1 | "user-status") //使用Cacheable注解标志这需要对方法进行缓存 (value= |
SpringBoot支持了多种的缓存实现,如EhCache 2.x
、Redis
、Caffeine
等等。但是接口方法是相同的,就如同使用jdbc一样。虽然实现不同,但是使用上并无差异。
SpringBoot 使用缓存注解
缓存抽象的核心是将缓存应用于Java方法上。这样,如果方法被调用,那么应用于方法上的缓存就开始检查是否按照给定规则进行缓存。
基于注解的缓存
对于缓存声明,Spring的缓存抽象提供了一组Java注解
一、@Cacheable 触发进行缓存
使用@Cacheable
注解在方法上,标志着这个方法是可缓存的。使用这个注解,可将方法的返回结构存储在缓存中,再次查询是,就可以从缓存中取结果而不是再次执行查询操作。如下面的例子:
1 | "books") ( |
因为缓存是key-value形式的,每次调用缓存时,都需要先找到正确的key。缓存抽象支持简单的KeyGenerator
几种生成的策略:作为参考上面的方法findBook
的Cacheable
的参数是books
。
- 如果没有参数 ,则使用
SimpleKey.EMPTY
. - 如果有一个参数,则使用这个参数作为key。
- 如果有多个参数,则返回
SimpleKey
中包含这多个参数。
这三种方式包含了大多数的使用场景。如果需要自定义key ,@Cacheable
允许使用key
关键字进行key的生成,key关键字的值可以使用SPEL
表达式进行表示。如Spring Doc中所举出的例子一样。根据实际的情况进行斟酌。
1 | "books", key="#isbn") (cacheNames= |
自定义的缓存条件 : 可以通过condition
关键字在@Cacheable
注解中进行条件的定制。如:
1 | "book", condition="#name.length() < 32") (cacheNames= |
具体的更多的spel
注解属性可以查看Spring文档中的内容 地址
二、@CacheEvict 触发清空缓存
在Spring cache
中不仅允许放置缓存,而且允许移除缓存。使用与Cacheable
相对的CacheEvict
注解来清空对应 key的缓存数据。
1 | // 使用allEntries用来表示删除所有这个cache中的缓存 |
三、@CachePut 触发更新缓存
当需要更新缓存而不干扰方法执行时,就是说每次调用方法时,都会更新缓存。
1 | "book", key="#isbn") (cacheNames= |
四、@Caching 组合使用多个cache注解方法
如果想使用多个cache动作来标注在方法上,就需要使用Caching
注解如下面的例子中所表示的一样,想要清空多个key的缓存
1 | "primary"), (cacheNames="secondary", key="#p0") }) (evict = { ( |
五、@CacheConfig 类上注解用来注解公共配置
上面的注解都是在方法级别上的对方法的返回值进行设置,而CacheConfig
是对类级别上的公共设置,如下面的例子中所展示的一样,设置公共的cache name
.
1 | "books") ( |
SpringBoot使用redis进行缓存
一、添加Pom依赖
1 | <dependency> |
二、配置redis相关属性
在引入spring-boot-starter-data-redis
后,启动主程序后会自动的开启redis
缓存。如果想配置redis
,则可以在org.springframework.boot.autoconfigure.data.redis.RedisProperties
这个属性类中查找,然后添加到application.yml中。如:
1 | private int database = 0; |
三、自定义redisTemplate和TtlCacheManager
根据SpringBoot自动配置源码,redisTemplate只有在环境中没有以redisTemplate
名称命名的bean时候,才进行自动配置。
1 |
|
所以,如果想自行配置redisTemplate则可直接装载bean,命名为redisTemplate
。如下:
1 |
|
这里是用来FastJson2JsonRedisSerializer
来代替默认的Jackson2JsonRedisSerializer
序列化策略。是在网上查找到的方法。
1 | public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> { |