缓存组件

介绍

程序中常出现一些查询访问高接口,不使用一些手段快速读取,会对数据库及网络造成一定压力。而在AgileBPM中,基于底层缓存框架抽象出了接口,面对不同场景使用不同的缓存实现。

缓存实现

系统属性:ab.cache.type

● memory

基于ConcurrentHashMap实现,本机高速缓存,适合单台机器部署

● redis

基于redis内存数据库实现,通过网络交互,适合集群化部署

● j2cache

两级缓存实现,通过组播方式更新缓存,适合集群化部署,能有效的减少网络调用。
第一级默认为 caffeine ,第二级默认为 redis,具体配置详见:缓存配置

缓存使用

缓存抽象接口:com.dstz.base.core.cache.ICache

编码使用

import com.dstz.base.core.cache.ICache;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
class Scratch {

@Resource
private ICache cache;

public void test() {
// 添加缓存数据
cache.add("xxx", new Object());
// 获取缓存数据
cache.getByKey("xxx");
// 删除缓存数据
cache.delByKey("xxx");
// 缓存数据是否存在
cache.containKey("xxx");

// 缓存区域:常用操作
cache.add2Region("xxx", "xxx", new Object());
cache.delByKey("xxx", "xxx");
cache.getByKey("xxx", "xxx");
}
}

声明式注解

为了简化缓存编码操作,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,在该方法被调用前就清空缓存,不用考虑该方法的执行结果(即不考虑是否抛出异常);而默认情况下,如果方法执行时发生异常,则不会清除缓存;

示例

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

@Cacheable(cacheNames="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

@Cacheable(cacheNames="book", condition="#name.length() < 32", unless="#result.hardback")
public Book findBook(String name)

@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)

参考文档

[spring]Spring Cache学习

Spring Integration