JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。 当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。
GitHub: https://github.com/alibaba/jetcache
全部特性:
• 通过统一的API访问Cache系统
• 通过注解实现声明式的方法缓存,支持TTL和两级缓存
• 通过注解创建并配置Cache实例
• 针对所有Cache实例和方法缓存的自动统计
• Key的生成策略和Value的序列化策略是可以配置的
• 分布式缓存自动刷新,分布式锁 (2.2+)
• 异步Cache API (2.2+,使用Redis的lettuce客户端时)
• Spring Boot支持
快速体验
增加Maven配置:
<groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.5.11</version>
配置内容
# jetcache 框架jetcache:# 控制台输出统计数据,统计间隔,0表示不统计statIntervalMinutes: 15areaInCacheName: falselocal:default:# 缓存类型。tair、redis为当前支持的远程缓存;linkedhashmap、caffeine为当前支持的本地缓存类型type: linkedhashmapkeyConvertor: fastjsonotherCacheName:type: xxxkeyConverter: yyyremote:default:host: 127.0.0.1port: 6379type: redisdatabase: 1# Key的转换器keyConvertor: fastjson# 采用Java序列化存储valueEncoder: javavalueDecoder: javapoolConfig:minIdle: 0maxIdle: 50
• remote 表示远程缓存
• local表示本地缓存
启动类开启缓存
@SpringBootApplication@EnableMethodCache(basePackages = "com.cxytiandi.jetcache")@EnableCreateCacheAnnotationpublic class App {public static void main(String[] args) {SpringApplication.run(App.class);}}
• @EnableMethodCache 用于激活@Cached注解的使用
• @EnableCreateCacheAnnotation 用于激活@CreateCache注解的使用
定义一个简单的实体类来作为数据的缓存,必须实现Serializable接口。
@Datapublic 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)@Overridepublic 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-serviceapp.id=${spring.application.name}apollo.bootstrap.enabled=true// 这是你要加的,指定缓存类型,我这边用的是lettucejetcache.remote.default.type=redis.lettuce
@Cached定义在接口上的坑
@Cached如果定义在接口上就不能指定key属性,框架中会自动根据参数生成key, 如果非得自己用SPEL表达式指定key的话,项目编译设置target必须为1.8格式,并且指定javac的-parameters参数,否则就要使用key=”args[0]”这样按下标访问的形式。我建议还是把@Cached的定义放在实现类上,也方便修改。
