Jetcache
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。 当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。
1 引入依赖
1.1 框架包 framework 1.0.0+
1.2 在项目application.properties文件中,添加,apollo://common.redis,apollo://common.cache
1.3 增加包扫描:
@EnableMethodCache(basePackages = "com.gotone")
@EnableCreateCacheAnnotation
2 使用示例
1 实现方法上注解:
@Cached(name = "UserServiceImpl.selectList",
expire = 3000,
localLimit = 100,
key = "#user.id",
cacheType = CacheType.BOTH)
2 创建实例:
@CreateCache(name = "signRuleList",
expire = 3600,
localLimit = 200,
cacheType = CacheType.LOCAL)
private Cache<String, List<SignRule>> signRuleCache;
3 分布式锁的应用:
/**
* 分布式锁示例
*/
public void DistributedLockExample() {
Long userId=111L;
Long productId=332L;
// 指定会员指定产品1s内仅能成单一次
boolean hasRun = distributedCache.tryLockAndRun(distributedCacheKey+userId+","+productId,1, TimeUnit.SECONDS, () -> {
try {
// 逻辑部分
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
参数 说明:
属性 | 默认值 | 说明 |
---|---|---|
area | “default” | 如果需要连接多个缓存系统,可在配置多个cache area,这个属性指定要使用的那个area的name |
name | 未定义 | 指定缓存的名称,不是必须的,如果没有指定,会使用类名+方法名。name会被用于远程缓存的key前缀。另外在统计中,一个简短有意义的名字会提高可读性。如果两个@CreateCache 的name 和area 相同,它们会指向同一个Cache 实例 |
expire | 未定义 | 该Cache实例的默认超时时间定义,注解上没有定义的时候会使用全局配置,如果此时全局配置也没有定义,则取无穷大 |
timeUnit | TimeUnit.SECONDS | 指定expire的单位 |
cacheType | CacheType.REMOTE | 缓存的类型,包括CacheType.REMOTE、CacheType.LOCAL、CacheType.BOTH。如果定义为BOTH,会使用LOCAL和REMOTE组合成两级缓存 |
localLimit | 未定义 | 如果cacheType为CacheType.LOCAL或CacheType.BOTH,这个参数指定本地缓存的最大元素数量,以控制内存占用。注解上没有定义的时候会使用全局配置,如果此时全局配置也没有定义,则取100 |
serialPolicy | 未定义 | 如果cacheType为CacheType.REMOTE或CacheType.BOTH,指定远程缓存的序列化方式。JetCache内置的可选值为SerialPolicy.JAVA和SerialPolicy.KRYO。注解上没有定义的时候会使用全局配置,如果此时全局配置也没有定义,则取SerialPolicy.JAVA |
keyConvertor | 未定义 | 指定KEY的转换方式,用于将复杂的KEY类型转换为缓存实现可以接受的类型,JetCache内置的可选值为KeyConvertor.FASTJSON和KeyConvertor.NONE。NONE表示不转换,FASTJSON通过fastjson将复杂对象KEY转换成String。如果注解上没有定义,则使用全局配置。 |