JetCache设计原理浅析

2022-09-28 19:53:21 浏览数 (1)

1、目录

  • JetCache介绍
  • 上帝视角:如何设计一个缓存组件?
  • SpringCache VS JetCache
  • JetCache基本使用
  • JetCache部分源码分析

2、JetCache介绍

3、如何设计一个缓存组件?

4、SpringCache VS JetCache

5、JetCache基本使用

5.1 JetCache配置信息

代码语言:javascript复制
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();

参考:

  1. alibaba/jetcache
  2. JetCache 缓存框架的使用以及源码分析
  3. JetCache源码分析

0 人点赞