浅析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缓存源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java线程池FutureTask实现原理详解

    Java线程池FutureTask实现原理详解

    这篇文章主要介绍了Java线程池FutureTask实现原理详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • MyBatis Mapper.XML 标签使用小结

    MyBatis Mapper.XML 标签使用小结

    在MyBatis中,通过resultMap可以解决字段名和属性名不一致的问题,对于复杂的查询,引用实体或使用<sql>标签可以定义复用的SQL片段,提高代码的可读性和编码效率,使用这些高级映射和动态SQL技巧,可以有效地处理复杂的数据库交互场景
    2024-10-10
  • SpringCloud中的断路器(Hystrix)和断路器监控(Dashboard)

    SpringCloud中的断路器(Hystrix)和断路器监控(Dashboard)

    本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识,需要的朋友可以参考下
    2019-06-06
  • 详细总结IDEA中打jar包的两种方式

    详细总结IDEA中打jar包的两种方式

    发现有很多小伙伴都不会用IDEA打jar包,今天给大家详细总结了两种IDEA打jar包的方式,对正在学习IDEA使用的小伙伴很有帮助,需要的朋友可以参考下
    2021-05-05
  • 关于@OnetoMany关系映射的排序问题,使用注解@OrderBy

    关于@OnetoMany关系映射的排序问题,使用注解@OrderBy

    这篇文章主要介绍了关于@OnetoMany关系映射的排序问题,使用注解@OrderBy,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • JavaSE实现图书管理系统的示例代码

    JavaSE实现图书管理系统的示例代码

    这篇博客是在学习了一部分Java基础语法之后的练习项目,通过这个小项目的练习,对Java中的类和对象,抽象类和接口等进行熟悉理解。快跟随小编一起学习学习吧
    2022-08-08
  • Spring BeanPostProcessor(后置处理器)的用法

    Spring BeanPostProcessor(后置处理器)的用法

    这篇文章主要介绍了Spring BeanPostProcessor(后置处理器)的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java实现爬取百度图片的方法分析

    Java实现爬取百度图片的方法分析

    这篇文章主要介绍了Java实现爬取百度图片的方法,结合实例形式分析了java基于jsonp爬取百度图片的相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2018-12-12
  • Spring Boot Actuator执行器运行原理详解

    Spring Boot Actuator执行器运行原理详解

    这篇文章主要介绍了Spring Boot Actuator执行器运行原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 深入了解Java语言中的并发性选项有何不同

    深入了解Java语言中的并发性选项有何不同

    这篇文章主要介绍了深入了解Java语言中的并发性选项有何不同,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06

最新评论