缓存组件
介绍
程序中常出现一些查询访问高接口,不使用一些手段快速读取,会对数据库及网络造成一定压力。而在AgileBPM中,基于底层缓存框架抽象出了接口,面对不同场景使用不同的缓存实现。
缓存实现
系统属性:ab.cache.type
● memory
基于ConcurrentHashMap
实现,本机高速缓存,适合单台机器部署
● redis
基于redis
内存数据库实现,通过网络交互,适合集群化部署
● j2cache
两级缓存实现,通过组播方式更新缓存,适合集群化部署,能有效的减少网络调用。
第一级默认为 caffeine
,第二级默认为 redis
,具体配置详见:缓存配置
缓存使用
缓存抽象接口:com.dstz.base.core.cache.ICache
编码使用
import com.dstz.base.core.cache.ICache; |
声明式注解
为了简化缓存编码操作,ICache与Spring缓存做了整合,用缓存注解实现方法结果缓存。
@Cacheable
● value/cacheNames
缓存名称,对应配置中region
,例如:jwtToken,未指定则默认
● key
SpEL表达式,缓存KEY;示例:’user:’.concat(#root.args[0])
SpEL 可用元数据
名称 | 描述 | 示例 |
---|---|---|
methodName | 当前方法名称 | #root.methodName |
method | 当前方法对象 | #root.method.name |
target | 当前被调用对象 | #root.target |
targetClass | 当前被调用对象的Class | #root.targetClass |
args | 当前方法参数组成的数组 | #root.args[0] |
caches | 当前被使用的缓存集合 | #root.caches[0].name |
参数名称 | 方法参数的名字,可以直接 #参数名或者使用 #p0或#a0 的 形式, 0代表参数的索引; | #iban, #a0, #p0, #p<#arg> |
result | 方法执行完成的返回值(仅当方法执行之后的判断有效,如 unless , beforeInvocation=false ) |
#result |
● unless
用于否决缓存的,和condition不同,condition是在方法开始之前判断,而该属性是在方法执行完成之后判断;所以condition不能通过方法返回值来判断,而unless属性可以;方法返回值是通过元数据result来表示的,true时表示不会缓存,为false时表示进行缓存;
● sync
表示是否异步,默认为false,也就是同步;一般情况下,Spring的Cache的缓存过期之后,这时候如果多个线程同时对某个数据进行访问,会同时去访问数据库,有可能导致数据库的压力顿时增大,所以Spring4.3之后引入了sync注解,当设置它为true时,会将缓存锁定,只有一个线程的请求会去访问数据库,其他线程都会等待直到缓存可用,这个设置可以减少对数据库的瞬间并发访问;
注意,不支持unless;实际上该属性只是一个提示或建议,至于是否支持要看我们的cache provider ;
@CacheEvict
该注解用于缓存的清除,注解参数上与@Cacheable大部分相同
● allEntries
是否清空所有的缓存内容,默认为false,如果指定为 true,则方法调用后将清空所有缓存;不过不允许在该值设置为true的情况下,再设置key的值
● beforeInvocation
是否在调用该方法之前清空缓存,默认为false;如果为true,在该方法被调用前就清空缓存,不用考虑该方法的执行结果(即不考虑是否抛出异常);而默认情况下,如果方法执行时发生异常,则不会清除缓存;
示例
"books", key="#isbn") (cacheNames= |