PS:本文为小组内部分享,图片居多,jetCache原理浅析。
1、目录
- JetCache介绍
- 上帝视角:如何设计一个缓存组件?
- SpringCache VS JetCache
- JetCache基本使用
- JetCache部分源码分析
2、JetCache介绍
3、如何设计一个缓存组件?
4、SpringCache VS JetCache
5、JetCache基本使用
5.1 JetCache配置信息
jetcache: statIntervalMinutes: 60 areaInCacheName: false penetrationProtect: true enableMethodCache: true hiddenPackages: com.xxx.xxx,com.xxx.xxx local: default: type: caffeine # 支持的类型:linkedhashmap、caffeine limit: 100 keyConvertor: fastjson # 支持的类型:fastjson,可自定义转换器函数 expireAfterWriteInMillis: 600000 expireAfterAccessInMillis: 300000 remote: default: type: redis.lettuce # 支持的类型:redis、redis.lettuce keyPrefix: '系统简称:所属名字:' keyConvertor: fastjson valueEncoder: java # 支持的类型:kryo、java,可自定义编码器 valueDecoder: java # 支持的类型:kryo、java,可自定义解码器 expireAfterWriteInMillis: 3600000 #readFrom: slavePreferred # 优先从Slave节点中读取 uri: redis-sentinel://host1:26379,host2:26379,host3:26379/?sentinelMasterId=mymaster # 哨兵模式 #uri: redis://127.0.0.1:6379/ # 单节点模式 #mode: masterslave # 设置为主从模式 #uri: # 集群模式 #- redis://127.0.0.1:7000 #- redis://127.0.0.1:7001 #- redis://127.0.0.1:7002 复制代码
5.2、JetCache使用示例
6、JetCache原理
- Cache:缓存接口,定义基本方法
- AbstractCache:抽象类,缓存接口的继承者,提供基本实现,具体实现交由不同的子类
- LinkedHashMapCache:基于LinkedHashMap设计的简易内存缓存
- CaffeineCache:基于 Caffeine 工具设计的内存缓存
- RedisCache:Redis实现,使用Jedis客户端
- RedisLettuceCache:Redis实现,使用 Lettuce 客户端
- MultiLevelCache:两级缓存,用于封装EmbeddedCache(本地缓存)和ExternalCache(远程缓存)
- RefreshCache:基于装饰器模式Decorator,提供自动刷新功能
- LazyInitCache:用于@CreateCache注解创建的缓存实例,依赖于Spring
JetCache源码入口
@EbableMethodCache -> JetCacheInterceptor JetCacheAutoConfiguration
缓存get/put基本实现
Cache->AbstractCache->AbstractEmbeddedCache->LinkedHashMapCache get()->GET()->do_GET()->map.get()
获取/存放 数据 -> 构建CacheResult -> 数据统计CacheState -> 缓存监控CacheMonitor
缓存过期时间的实现
被动过期:
主动过期 Cleaner:
缓存自动刷新的实现
RefreshCache
防止缓存击穿的实现
@CachePenetrationProtect -> AbstractCache.computeIfAbsentImpl() -> synchronizedLoad();