JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。
当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。
全部特性:
- 通过统一的API访问Cache系统
- 通过注解实现声明式的方法缓存,支持TTL和两级缓存
- 通过注解创建并配置Cache实例
- 针对所有Cache实例和方法缓存的自动统计
- Key的生成策略和Value的序列化策略是可以配置的
- 分布式缓存自动刷新,分布式锁 (2.2+)
- 异步Cache API (2.2+,使用Redis的lettuce客户端时)
- Spring Boot支持
创建缓存实例
创建一个两级(内存+远程)的缓存,内存中的元素个数限制在50个。@CreateCache(expire = 100)private Cache<Long, UserDO> userCache;
@CreateCache(name = "UserService.userCache", expire = 100, cacheType = CacheType.BOTH, localLimit = 50)private Cache<Long, UserDO> userCache;
@CreateCache属性表
| 属性 | 默认值 | 说明 | | —- | —- | —- | | 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。如果注解上没有定义,则使用全局配置。 |
基本配置(使用Spring Boot)
<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.6.4</version></dependency>
配置一个spring boot风格的application.yml文件,把他放到资源目录中
jetcache:statIntervalMinutes: 15areaInCacheName: falselocal:default:type: linkedhashmapkeyConvertor: fastjsonremote:default:type: rediskeyConvertor: fastjsonvalueEncoder: javavalueDecoder: javapoolConfig:minIdle: 5maxIdle: 20maxTotal: 50host: 127.0.0.1port: 6379
然后创建一个App类放在业务包的根下,EnableMethodCache,EnableCreateCacheAnnotation这两个注解分别激活Cached和CreateCache注解,其他和标准的Spring Boot程序是一样的。这个类可以直接main方法运行。
package com.company.mypackage;import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;import com.alicp.jetcache.anno.config.EnableMethodCache;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableMethodCache(basePackages = "com.company.mypackage")@EnableCreateCacheAnnotationpublic class MySpringBootApp {public static void main(String[] args) {SpringApplication.run(MySpringBootApp.class);}}
未使用SpringBoot的配置方式
pom
<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-anno</artifactId><version>2.6.4</version></dependency><dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-redis</artifactId><version>2.6.4</version></dependency>
配置了这个JetCacheConfig类以后,可以使用@CreateCache和@Cached注解。
package com.company.mypackage;import java.util.HashMap;import java.util.Map;import com.alicp.jetcache.anno.CacheConsts;import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;import com.alicp.jetcache.anno.config.EnableMethodCache;import com.alicp.jetcache.anno.support.GlobalCacheConfig;import com.alicp.jetcache.anno.support.SpringConfigProvider;import com.alicp.jetcache.embedded.EmbeddedCacheBuilder;import com.alicp.jetcache.embedded.LinkedHashMapCacheBuilder;import com.alicp.jetcache.redis.RedisCacheBuilder;import com.alicp.jetcache.support.FastjsonKeyConvertor;import com.alicp.jetcache.support.JavaValueDecoder;import com.alicp.jetcache.support.JavaValueEncoder;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.util.Pool;@Configuration@EnableMethodCache(basePackages = "com.company.mypackage")@EnableCreateCacheAnnotationpublic class JetCacheConfig {@Beanpublic Pool<Jedis> pool(){GenericObjectPoolConfig pc = new GenericObjectPoolConfig();pc.setMinIdle(2);pc.setMaxIdle(10);pc.setMaxTotal(10);return new JedisPool(pc, "localhost", 6379);}@Beanpublic SpringConfigProvider springConfigProvider() {return new SpringConfigProvider();}@Beanpublic GlobalCacheConfig config(Pool<Jedis> pool){// public GlobalCacheConfig config(SpringConfigProvider configProvider, Pool<Jedis> pool){ // for jetcache 2.5Map localBuilders = new HashMap();EmbeddedCacheBuilder localBuilder = LinkedHashMapCacheBuilder.createLinkedHashMapCacheBuilder().keyConvertor(FastjsonKeyConvertor.INSTANCE);localBuilders.put(CacheConsts.DEFAULT_AREA, localBuilder);Map remoteBuilders = new HashMap();RedisCacheBuilder remoteCacheBuilder = RedisCacheBuilder.createRedisCacheBuilder().keyConvertor(FastjsonKeyConvertor.INSTANCE).valueEncoder(JavaValueEncoder.INSTANCE).valueDecoder(JavaValueDecoder.INSTANCE).jedisPool(pool);remoteBuilders.put(CacheConsts.DEFAULT_AREA, remoteCacheBuilder);GlobalCacheConfig globalCacheConfig = new GlobalCacheConfig();// globalCacheConfig.setConfigProvider(configProvider); // for jetcache 2.5globalCacheConfig.setLocalCacheBuilders(localBuilders);globalCacheConfig.setRemoteCacheBuilders(remoteBuilders);globalCacheConfig.setStatIntervalMinutes(15);globalCacheConfig.setAreaInCacheName(false);return globalCacheConfig;}}
