浅析Java中的Caffeine缓存源码

 更新时间:2023年10月09日 10:04:34   作者:阿湯哥  
这篇文章主要介绍了浅析Java中的Caffeine缓存源码,Caffeine是一个Java开发的高性能缓存库,它提供了一种简单而强大的方式来管理内存中的缓存数据,Caffeine的设计目标是提供快速、高效的缓存访问,同时保持简单易用的API,本文针对其部分源码做出解析,需要的朋友可以参考下

1. Caffenie的核心类图

在这里插入图片描述

2. Caffenie缓存的分类

Caffenie从同步-异步、手工加载-自动加载、有界-无界三个维度,可以分为8中缓存类型。

在这里插入图片描述

3. LocalCacheFactory缓存工厂

com.github.benmanes.caffeine.cache.LocalCacheFactory#newBoundedLocalCache (只针对有界队列)

static <K, V> BoundedLocalCache<K, V> newBoundedLocalCache(Caffeine<K, V> builder,
  @Nullable CacheLoader<? super K, V> cacheLoader, boolean async) {
  StringBuilder sb = new StringBuilder("com.github.benmanes.caffeine.cache.");
  if (builder.isStrongKeys()) {
    sb.append('S');
  } else {
    sb.append('W');
  }
  if (builder.isStrongValues()) {
    sb.append('S');
  } else {
    sb.append('I');
  }
  if (builder.removalListener != null) {
    sb.append('L');
  }
  if (builder.isRecordingStats()) {
    sb.append('S');
  }
  if (builder.evicts()) {
    sb.append('M');
    if (builder.isWeighted()) {
      sb.append('W');
    } else {
      sb.append('S');
    }
  }
  if (builder.expiresAfterAccess() || builder.expiresVariable()) {
    sb.append('A');
  }
  if (builder.expiresAfterWrite()) {
    sb.append('W');
  }
  if (builder.refreshes()) {
    sb.append('R');
  }
  try {
    Class<?> clazz = LocalCacheFactory.class.getClassLoader().loadClass(sb.toString());
    Constructor<?> ctor = clazz.getDeclaredConstructor(Caffeine.class, CacheLoader.class, boolean.class);
    @SuppressWarnings("unchecked")
    BoundedLocalCache<K, V> factory = (BoundedLocalCache<K, V>) ctor.newInstance(builder, cacheLoader, async);
    return factory;
  } catch (ReflectiveOperationException e) {
    throw new IllegalStateException(sb.toString(), e);
  }
}

4. 缓存维护

com.github.benmanes.caffeine.cache.BoundedLocalCache#maintenance

/**
 * Performs the pending maintenance work and sets the state flags during processing to avoid
 * excess scheduling attempts. The read buffer, write buffer, and reference queues are
 * drained, followed by expiration, and size-based eviction.
 *
 * @param task an additional pending task to run, or {@code null} if not present
 */
@GuardedBy("evictionLock")
void maintenance(@Nullable Runnable task) {
  lazySetDrainStatus(PROCESSING_TO_IDLE);
  try {
    drainReadBuffer();
    drainWriteBuffer();
    if (task != null) {
      task.run();
    }
    drainKeyReferences();
    drainValueReferences();
    expireEntries();
    evictEntries();
    climb();
  } finally {
    if ((drainStatus() != PROCESSING_TO_IDLE) || !casDrainStatus(PROCESSING_TO_IDLE, IDLE)) {
      lazySetDrainStatus(REQUIRED);
    }
  }
}

到此这篇关于浅析Java中的Caffeine缓存源码的文章就介绍到这了,更多相关Caffeine缓存源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot多环境配置及配置文件分类实例详解

    SpringBoot多环境配置及配置文件分类实例详解

    这篇文章主要介绍了SpringBoot多环境配置及配置文件分类,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java对象转JSON时动态的增删改查属性详解

    Java对象转JSON时动态的增删改查属性详解

    这篇文章主要介绍了Java对象转JSON时如何动态的增删改查属性的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java文件写入器FileWriter使用指南

    Java文件写入器FileWriter使用指南

    在Java中,FileWriter类用于将字符写入文件中,它继承了Writer类,因此可以使用Writer类中的所有方法,下面我们就来深入探讨一下FileWriter类的使用方法吧
    2023-10-10
  • spring cloud consul使用ip注册服务的方法示例

    spring cloud consul使用ip注册服务的方法示例

    这篇文章主要介绍了spring cloud consul使用ip注册服务的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java多线程+锁机制实现简单模拟抢票的项目实践

    Java多线程+锁机制实现简单模拟抢票的项目实践

    锁是一种同步机制,用于控制对共享资源的访问,在线程获取到锁对象后,可以执行抢票操作,本文主要介绍了Java多线程+锁机制实现简单模拟抢票的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 详解spring boot mybatis全注解化

    详解spring boot mybatis全注解化

    这篇文章主要介绍了spring boot mybatis全注解化的相关资料,需要的朋友可以参考下
    2017-09-09
  • SpringMvc请求处理参数 和 响应数据处理的示例详解

    SpringMvc请求处理参数 和 响应数据处理的示例详解

    这篇文章主要介绍了SpringMvc请求处理参数和响应数据处理,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • SpringCloud GateWay路由网关与Config配置中心详解

    SpringCloud GateWay路由网关与Config配置中心详解

    文章主要介绍了SpringCloud Gateway路由网关的部署与配置,包括添加路由、配置路由过滤器、编写全局过滤器等步骤,还介绍了配置中心的使用方法,包括创建配置中心和客户端配置,以及CAP理论的应用场景和特点,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • 如何准确判断邮件地址是否存在

    如何准确判断邮件地址是否存在

    本文介绍了如何判断邮件地址是否存在的方法,具有很高的使用价值,提高了工作效率
    2015-07-07
  • Java堆&优先级队列示例讲解(上)

    Java堆&优先级队列示例讲解(上)

    这篇文章主要通过示例详细为大家介绍Java中的堆以及优先级队列,文中的示例代码讲解详细,对我们了解java有一定帮助,需要的可以参考一下
    2022-03-03

最新评论