本文共 1856 字,大约阅读时间需要 6 分钟。
Java Caching定义了5个接口
1. CachingProvider
定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期间访问多个CachingProvider。【缓存提供者】
2. CacheManager
定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManage的上下文中,一个CacheManage只被一个CachingProvider拥有。【缓存管理器】
3. Cache
类似于Map的数据结构并临时储存以key为索引的值,一个Cache仅仅被一个CacheManager所拥有。【缓存】
4. Entry
存储在Cache中的key-value对。
5. Expiry
存储在Cache的条目有一个定义的有效期,一旦超过这个时间,就会设置过期的状态,过期无法被访问,更新,删除。缓存的有效期可以通过ExpiryPolicy设置。【缓存过期时间】
它们之间的关系如下图:
包含了一些JSR107的注解
注解 | 功能 |
Cache | 缓存接口,定义缓存操作,实现有:RedisCache、EhCache、ConcurrentMapCache等 |
CacheManager | 缓存管理器,管理各种缓存(Cache)组件 |
@Caching | 重新组合要在方法上应用的多个缓存操作 |
@Cacheable | 针对方法配置,根据方法的请求参数对其结果进行缓存 |
@CacheEvict | 清空缓存 |
@CachePut | 保证方法被调用,即方法一定会被执行,又希望结果被缓存 update调用,将信息更新缓存 |
@EnableCaching | 开启基于注解的缓存 |
KeyGenerator | 缓存数据时key生成的策略 |
serialize | 缓存数据时value序列化策略 |
1. 实体类实现序列化
public class xxx implements Serializable { ....}
2. 导入依赖
org.springframework.boot spring-boot-starter-cache
3. 主配置类使用@EnableCaching开启缓存
@SpringBootApplication@EnableCaching@MapperScan("com.xuyuan.mapper")public class SpringbootRedisApplication { public static void main(String[] args) { SpringApplication.run(SpringbootRedisApplication.class, args); }}
4. 将缓存注解写到service层
将方法的运行结果进行缓存,以后要是再有相同的数据,直接从缓存中获取,不用调用方法。
CacheManager管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每个缓存组件都有自己的唯一名字。
如:
在Redis客户端通过value::key获取
@Cacheable(value = "user",key = "#id") public User getById(String id) { return userMapper.getById(id);}
补充介绍一下注解的几种属性
属性 | 用途 |
CacheName/value(二选一) | 指定存储缓存组件的名字 |
value | 缓存的名字,必须指定至少一个 |
key | 缓存数据使用的key,可以使用它来指定。默认是使用方法参数的值 |
编写Spel表达式 | #id 参数id的值, #a0/#p0/#root.args[0] 输入的第一个参数 |
keyGenerator | key的生成器,自己可以指定key的生成器的组件id 注意:key和keyGenerator 二者选一使用 |
cacheManager | 指定Cache管理器,或者cacheReslover指定获取解析器 |
condition | 指定符合条件的情况下才缓存 |
unless | 否定缓存,unless指定的条件为true,方法的返回值就不会被缓存,可以获取到结果进行判断 |
sync | 是否使用异步模式,unless不支持 |
然后就可以进行测试啦!
转载地址:http://xpqen.baihongyu.com/