Spring Boot缓存管理
缓存是分布式系统的重要组件,主要解决数据库数据的高并发访问问题。在实际开发中,尤其是用户访问量较大的网站,为了提高服务器访问性能、减少数据库的压力、提高用户体验,使用缓存显得尤为重要。
6.1 Spring Boot 默认缓存管理
Spring 框架支持透明地向应用程序添加缓存并对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法中,从而减少操作数据的次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能,通过使用@EnableCaching注解开启基于注解的缓存支持,Spring Boot可以启动缓存管理的自动化配置。
6.1.2 Spring Boot 默认缓存体验
- 使用@EnableCaching注解开启基于注解的缓存支持,该注解通常会添加在项目启动类上
- 使用@Cacheable注解对数据操作方法进行缓存管理。将@Cacheable注解标注在Service类的查询方法上,对查询结果进行缓存。
6.2 Spring Boot 缓存注解介绍
1.@EnableCaching注解
Spring框架提供,Spring Boot框架对该注解进行了继承,配置在启动类,开启基于注解的缓存支持。
2.@Cacheable注解
Spring框架提供的,可以作用于类或方法,用于对方法的查询结果进行缓存管理。
属性名 | 说明 |
---|---|
value/cacheNames | 指定缓存空间的名称,必配属性,二选一 |
key | 指定缓存数据的key,默认使用方法参数值,可以使用SpEL表达式 |
keyGenerator | 缓存数据的key的生成器,与key属性二选一使用 |
cacheManager | 缓存管理器 |
cacheResolver | 缓存解析器,cacheManager属性二选一使用 |
condition | 符合某条件下,进行数据缓存 可以使用SpEL表达式 |
unless | 符合条件不尽兴数据缓存 |
sync | 是否使用异步缓存 |
- key属性
如果缓存数据时,没有指定key属性,Spring boot默认提供的配置类SimpleKeyGenerator会通过generateKey(Object…params) 方法参数生成key值,如果 方法没有参数,key属性是空参的SimpleKey[]对象,如果多个参数,那么key属性是一个带参的SimpleKey[param1,[param2,…]]对象
名称 | 位置 | 描述 | 示例 |
---|---|---|---|
methodName | root对象 | 当前被调用的方法名 | #root.methodName |
method | root对象 | 当前被调用的方法 | #root.method.name |
target | root对象 | 当前被调用的目标对象实例 | #root.target |
targetClass | root对象 | 当前被调用的对象的类 | #root.targetClass |
args | root对象 | 当前被调用的方法的参数列表 | #root.args[0] |
caches | root对象 | 当前被调用对象的缓存列表 | #root.caches[0].name |
ArgumentName | 执行上下文 | 当前被调用的方法参数 可以用#参数名 或者 #a0 #p0的形式表示 0代表参数索引从0开始 | #comment_id #a0 #p0 |
result | 执行上下文 | 当前方法执行后的返回结果 | #result |
- KeyGenerator 属性
KeyGenerator属性与Key属性本质作用相同, 用于指定缓存数据的key,只不过KeyGenerator属性指定的不是具体的key值,而是key值的生成器规则。
3.@CachePut 注解
作用于类或者方法,更新缓存数据
4.@CacheEvict 注解
作用于类或者方法上,该注解的作用是删除缓存数据。
- allEntries 属性
表示是否清除指定缓存空间中的所有缓存数据,默认false(默认只删除指定key对应的缓存数据) - beforeInvocation属性
表示是否在方法执行之前缓存清除,默认为false,如果设置为true可能有弊端 |
5.@Caching 注解
处理负责规则的数据缓存,可以作用于类或者方法
包含cacheable put evict三个属性,作用等同于@Cacheable @CachePut @CacheEvict
6.CacheConfig
注解作用于类 用于统筹管理类中所有使用@Cacheable @CachePut @CacheEvit
属性值就近原则
6.3 Spring Boot 整合Redis 缓存实现
6.3.1 Spring Boot 支持的缓存组件
在Spring Boot,数据的管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 缓存管理器接口。
如果程序中没哟定义类型为cacheManager 的Bean组件或者是名为 cacheResolver的cacheResolver缓存解析器,Spring Boot将尝试选择开启以下缓存组件(按照指定的顺序)
- Generic
- JCache(JSR - 107) (EhCache 3、Hazelcast、Infinispan等)
- EhCache 2.x
- Hazelcast
- Infinispan
- Couchbase
- Redis
- Caffeine
- Simple
6.3.2 基于注解的Redis缓存实现
- 添加依赖启动器
<dependency>
<groupId>org.springframework.boot&l