Spring缓存抽象
包括一些JSR107的注解
CahceManager
Cache
基本概念
重要的概念&缓存注解
功能 | |
---|---|
Cache | 缓存接口,定义缓存操作,实现有:RedisCache、EhCacheCache、ConcurrentMapCache等 |
CacheManager | 缓存管理器,管理各种缓存(Cache)组件 |
@Cacheable | 对方法结果开启缓存,根据方法的请求参数对其结果进行缓存 |
@CacheEvict | 清空缓存 |
@CachePut | 保证方法被调用,又希望结果被缓存 update,调用,将信息更新缓存 |
@EnableCaching | 开启基于注解的缓存 |
KeyGenerator | 缓存数据时key生成的策略 |
serialize | 缓存数据时value序列化策略 |
注解参数说明
参数名称 | 功能 | 示例 |
---|---|---|
cacheNames/value | 必填,它指定了你的缓存存放在哪块命名空间 | @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”} |
key | 缓存数据key-value 指定key的值,使用SPEL表达式 | 例如:@Cacheable(value=”testcache”, key=”#userName”) |
condition | 缓存的条件,可以为空,使用spel编写返回true或false,只有在true的时候才进行缓存或者清除缓存 | @Cacheable(value=”testcache”, condition=”#userName.length()>2”) |
allEntries | ||
(@CacheEvict) | 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 | @CachEvict(value=”testcache”, allEntries=true) |
beforeInvocation | ||
(@CacheEvict) | 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 | @CachEvict(value=”testcache”,beforeInvocation=true) |
unless (@CachePut) (@Cacheable) | 用于否决缓存的,不像condition,该表达式只在方法执行之后判断,此时可以拿到返回值result进行判断。条件为true不会缓存,fasle才缓存 | @Cacheable(value=”testcache”, unless=”#result == null”) |
缓存SPEL表达式使用
名字 | 位置 | 描述 | 示例 |
---|---|---|---|
methodName | root object | 当前被调用的方法名 | #root.methodName |
method | root object | 当前被调用的方法 | #root.method.name |
target | root object | 当前被调用的目标对象 | #root.target |
targetClass | root object | 当前被调用的目标对象类 | #root.targetClass |
args | root object | 当前被调用的方法的参数列表 | #root.args[0] |
caches | root object | 当前方法调用使用的缓存列表(如@Cacheable(value={“cache1”, “cache2”})),则有两个cache | #root.caches[0].name |
argument name | evaluation context | 方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0或#a0 的形式,0代表参数的索引; | #iban 、 #a0 、 #p0 |
result | evaluation context | 方法执行后的返回值(仅当方法执行之后的判断有效,如‘unless’,’cache put’的表达式 ’cache evict’的表达式beforeInvocation=false) | #result |
运行流程
@Cacheable
注解
- 方法运行之前,先查Cache(缓存组件),按照
vlalue/Cachenames
的指定名字获取, - 第一次获取缓存如果没有Cache组件则会自己创建Cache组件
- 去Cache组件中查找缓存内容,使用
key
(默认是方法的参数)去查找缓存值。key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key - 查到缓存则取缓存中的值作为方法的返回值,如果没有查到缓存则调用目标方法,将目标方法的返回结果放到缓存中。
@Cacheput
注解
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法或者修改方法上。
1、 先运行方法,再将结果缓存起来
@CacheEvict
注解
使用该注解标注的方法,会情况指定的缓存,一般应用于更新或者删除方法上。
整合Redis
Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化。
Redis的特点
1,Redis读取的速度是110000次/s,写的速度是81000次/s;
2,原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
3,支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
4,持久化,集群部署
5,支持过期时间,支持事务,消息订阅
谷粒教育整合Redis
由于Redis缓存是公共应用会在多个微服务模块中应用,所以我们把依赖和配置全部添加到Common
模块下
- 添加Redis整合依赖
- appilication.yml配置Redis连接地址
- 对需要缓存实体类序列化
- 使用
RestTemplate
操作redis
redisTemplate.