本文主要是介绍JetCache源码解析——概览,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简介
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支持
创建缓存实例
通过@CreateCache注解创建一个缓存实例,默认超时时间是100秒
@Autowired
private CacheManager cacheManager;private Cache<Long, UserDO> userCache;@PostConstruct
public void init() {QuickConfig qc = QuickConfig.newBuilder("userCache") // name用于统计信息展示名字.expire(Duration.ofSeconds(100))//.cacheType(CacheType.BOTH) // 创建一个两级缓存//.localLimit(100) // 本地缓存元素个数限制,只对CacheType.LOCAL和CacheType.BOTH有效//.syncLocal(true) // 两级缓存的情况下,缓存更新时发消息让其它JVM实例中的缓存失效,需要配置broadcastChannel才生效。.build();userCache = cacheManager.getOrCreateCache(qc);
}
用起来就像map一样:
UserDO user = userCache.get(123L);
userCache.put(123L, user);
userCache.remove(123L);
创建方法缓存
使用@Cached注解可以为一个方法添加上缓存。JetCache通过Spring AOP生成代理,来支持缓存功能。注解可以加在接口方法上也可以加在类方法上,但需要保证是个Spring bean。
public interface UserService {@Cached(name="UserService.getUserById", expire = 3600)User getUserById(long userId);
}
基本配置(使用Spring Boot)
如果使用Spring Boot,可以按如下的方式配置(这里使用了jedis客户端连接redis,也可以使用lettuce客户端)。
<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>${jetcache.latest.version}</version>
</dependency>
配置一个spring boot风格的application.yml文件,把他放到资源目录中
jetcache:statIntervalMinutes: 15areaInCacheName: falselocal:default:type: linkedhashmapkeyConvertor: fastjsonremote:default:type: rediskeyConvertor: fastjson2broadcastChannel: projectAvalueEncoder: 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")
@EnableCreateCacheAnnotation
public class MySpringBootApp {public static void main(String[] args) {SpringApplication.run(MySpringBootApp.class);}
}
根据上面的简单描述,我们可以发现JetCache是支持多级缓存的,而且跟J2Cache和Spring.data.cache差不多,都可以通过简单的在方法上使用@Cached、@CacheUpdate、@CacheRefresh、@CacheInvalidate等注解来添加缓存、更新缓存和移除缓存。JetCache不仅支持已有的内存缓存框架,如LinkedHashMap和caffeine,也支持通过jedis、lettuce、redisson和spring-data-redis来缓存数据到Redis服务。当然JetCache不仅可以缓存数据,也可以基于Redis提供了锁的功能。在2.7.X之前的版本中,JetCache并不支持订阅Redis服务端的事件来刷新内存缓存的数据,只提供了一个进程内缓存数据变更的事件广播器,我们就不得不自己去实现相应的功能以保证Redis和内存数据的一致性。
针对JetCache框架的源码分析,我们可以基于如下几个问题,分章节进行介绍:
- JetCache在服务启动时,如何加载缓存配置?
- 添加、更新、移除和刷新缓存操作是如何被执行的?
- JetCache高级特性的支持和扩展有哪些?
这篇关于JetCache源码解析——概览的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!