共计 2903 个字符,预计需要花费 8 分钟才能阅读完成。
之前一直在用 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