乐趣区

阿里开源的缓存框架JetCache

之前一直在用 Spring Cache 进行接口数据的缓存,主要是 Spring Cache 在对具体 key 缓存失效时间的设置不是很方法,还要自己去扩展,无意中发现了阿里的 JetCache。大部分的需求都能满足,并且有一些很实用的功能,今天给大家介绍下。
JetCache 是一个基于 Java 的缓存系统封装,提供统一的 API 和注解来简化缓存的使用。JetCache 提供了比 SpringCache 更加强大的注解,可以原生的支持 TTL、两级缓存、分布式自动刷新,还提供了 Cache 接口用于手工缓存操作。当前有四个实现,RedisCache、TairCache(此部分未在 github 开源)、CaffeineCache(in memory) 和一个简易的 LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。
GitHub:https://github.com/alibaba/je…
全部特性:

通过统一的 API 访问 Cache 系统
通过注解实现声明式的方法缓存,支持 TTL 和两级缓存
通过注解创建并配置 Cache 实例
针对所有 Cache 实例和方法缓存的自动统计
Key 的生成策略和 Value 的序列化策略是可以配置的
分布式缓存自动刷新,分布式锁 (2.2+)
异步 Cache API (2.2+,使用 Redis 的 lettuce 客户端时)
Spring Boot 支持

体验一下
增加 Maven 配置:
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
<version>2.5.11</version>
</dependency>
配置内容:
# 采用 Java 序列化存储
jetcache.remote.default.valueDecoder = java
# Key 的转换器
jetcache.remote.default.keyConvertor = fastjson
# 是否加入缓存 key 前缀
jetcache.areaInCacheName = false
jetcache.remote.default.valueEncoder = java
# 缓存类型。tair、redis 为当前支持的远程缓存;linkedhashmap、caffeine 为当前支持的本地缓存类型
jetcache.local.default.type = linkedhashmap
# 控制台输出统计数据,统计间隔,0 表示不统计
jetcache.statIntervalMinutes = 15
jetcache.local.default.keyConvertor = fastjson
jetcache.remote.default.uri = redis://192.168.0.210:6379/

remote 表示远程缓存
local 表示本地缓存

启动类开启缓存:
@SpringBootApplication
@EnableMethodCache(basePackages = “com.cxytiandi.jetcache”)
@EnableCreateCacheAnnotation
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
}
@EnableMethodCache
用于激活 @Cached 注解的使用
@EnableCreateCacheAnnotation
用于激活 @CreateCache 注解的使用
定义一个简单的实体类来作为数据的缓存,必须实现 Serializable 接口。
@Data
public class User implements Serializable {

private Long id;

private String name;

}
@CreateCache 使用
@CreateCache(expire = 100)
private Cache<Long, User> userCache;

User user = new User();
user.setId(1L);
user.setName(“yinjihuan”);
// 新增缓存
userCache.put(1L, user);

// 删除缓存
userCache.remove(1L);
用起来很简单,就像操作本地 Map 一样,@CreateCache 中有很多配置需要我们自己去指定,不指定则使用默认的,关于配置请查看文档:https://github.com/alibaba/jetcache/wiki/CreateCache_CN
@Cached 使用
@Cached(name=”getUser.”, key=”#id”, expire = 8, cacheType=CacheType.BOTH)
@Override
public User getUser(Long id) {
User user = new User();
user.setId(1L);
user.setName(“yinjihuan”);
return user;
}
name
缓存名称
key
缓存 key, 追加到 name 后面构成唯一的缓存 key, 使用 SpEL 指定 key,如果没有指定会根据所有参数自动生成。
expire
缓存失效时间
cacheType
缓存的类型,包括 CacheType.REMOTE、CacheType.LOCAL、CacheType.BOTH。如果定义为 BOTH,会使用 LOCAL 和 REMOTE 组合成两级缓存
更多配置的介绍请查看文档:https://github.com/alibaba/jetcache/wiki/MethodCache_CN
今天的介绍就到这里,使用起来还是很方便的,关于更多的功能大家自行去尝试吧,比如缓存定时刷新,缓存命中率统计,自定义序列化方式等等。
整合 Apollo 的坑在这边提一个容易被坑到的点,如果你们的配置都是在 Apollo 中进行管理的话,那么在集成的时候会有个问题,需要在项目中加上下面的配置才行,其余的配置可以放 Apollo 中。
spring.application.name=district-service
app.id=${spring.application.name}
apollo.bootstrap.enabled=true
// 这是你要加的,指定缓存类型,我这边用的是 lettuce
jetcache.remote.default.type=redis.lettuce
@Cached 定义在接口上的坑还有一个呢就是 @Cached 如果定义在接口上就不能指定 key 属性,框架中会自动根据参数生成 key, 如果非得自己用 SPEL 表达式指定 key 的话,项目编译设置 target 必须为 1.8 格式,并且指定 javac 的 -parameters 参数,否则就要使用 key=”args[0]” 这样按下标访问的形式。我建议还是把 @Cached 的定义放在实现类上,也方便修改。
我这边也录制了一套视频,感兴趣的可以去了解下:http://cxytiandi.com/course/24

退出移动版