JetCache设计原理浅析

1、目录

2、JetCache介绍

image.png

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

image.png

4、SpringCache VS JetCache

image.png

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

image.png
image.png
image.png

5.2、JetCache使用示例

image.png
image.png
image.png
image.png
image.png

6、JetCache原理

image.png

  • 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

缓存过期时间的实现

被动过期:
image.png
主动过期 Cleaner:
image.png
image.png

缓存自动刷新的实现

RefreshCache
image.png
image.png
image.png

防止缓存击穿的实现

@CachePenetrationProtect -> AbstractCache.computeIfAbsentImpl() -> synchronizedLoad();
image.png
image.png

参考:

  1. alibaba/jetcache

  2. JetCache 缓存框架的使用以及源码分析

  3. JetCache源码分析

posted @ 2022-09-05 21:37  一枝花算不算浪漫  阅读(563)  评论(0编辑  收藏  举报