此文已由作者赵计刚授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

下面介绍在LocalCache(CacheBuilder, CacheLoader)中调用的一些方法:

  • CacheBuilder-->getConcurrencyLevel()

    int getConcurrencyLevel() {return (concurrencyLevel == UNSET_INT) ? //是否设置了concurrencyLevelDEFAULT_CONCURRENCY_LEVEL//如果没有设置,采用默认值16: concurrencyLevel;//如果设置了,采用设置的值}

    说明:检查是否设置了concurrencyLevel,如果设置了,采用设置的值,如果没有设置,采用默认值16

  • CacheBuilder-->getKeyStrength()

    //获取键key的强度(默认为Strong,还有weak和soft)Strength getKeyStrength() {return MoreObjects.firstNonNull(keyStrength, Strength.STRONG);}

    说明:获取key的引用类型(强度),默认为Strong(强引用类型),下表列出MoreObjects的方法firstNonNull(@Nullable T first, @Nullable T second)

    public static <T> T firstNonNull(@Nullable T first, @Nullable T second) {return first != null ? first : checkNotNull(second);}
  • CacheBuilder-->getValueStrength()

        Strength getValueStrength() {return MoreObjects.firstNonNull(valueStrength, Strength.STRONG);}

    说明:获取value的引用类型(强度),默认为Strong(强引用类型)

  • CacheBuilder-->getExpireAfterWriteNanos()

    long getExpireAfterWriteNanos() {return (expireAfterWriteNanos == UNSET_INT) ? DEFAULT_EXPIRATION_NANOS: expireAfterWriteNanos;}

    说明:获取超时时间,如果设置了,就是设置值,如果没设置,默认是0

  • CacheBuilder-->getInitialCapacity()

    int getInitialCapacity() {return (initialCapacity == UNSET_INT) ? DEFAULT_INITIAL_CAPACITY: initialCapacity;}

    说明:获取初始化容量,如果指定了就是用指定容量,如果没指定,默认为16。值得注意的是,该容量是用于计算每个Segment的容量的,并不一定是每个Segment的容量,其具体使用的方法见LocalCache(CacheBuilder, CacheLoader)

  • LocalCache-->evictsBySize()

    //这里maxWeight没有设置值,默认为UNSET_INT,即-1boolean evictsBySize() {return maxWeight >= 0;}

    说明:这是一个与weight相关的方法,由于我们没有设置weight,所以该方法对我们的程序没有影响。

到目前为止,guava cache的完整的一个数据结构基本上就建立起来了。最后再总结一下。

guava cache的数据结构:

guava cache的数据结构的构建流程:

1)构建CacheBuilder实例cacheBuilder

2)cacheBuilder实例指定缓存器LocalCache的初始化参数

3)cacheBuilder实例使用build()方法创建LocalCache实例(简单说成这样,实际上复杂一些)

3.1)首先为各个类变量赋值(通过第二步中cacheBuilder指定的初始化参数以及原本就定义好的一堆常量)

3.2)之后创建Segment数组

3.3)最后初始化每一个Segment[i]

3.3.1)为Segment属性赋值

3.3.2)初始化Segment中的table,即一个ReferenceEntry数组(每一个key-value就是一个ReferenceEntry)

3.3.3)根据之前类变量的赋值情况,创建相应队列,用于LRU缓存回收算法

这里,我们就用开头给出的代码实例,来看一下,最后构建出来的cache结构是个啥:

显示指定:

expireAfterWriteNanos==20min   maximumSize==1000

默认值:

concurrency_level==4(用于计算Segment个数)     initial_capcity==16 (用于计算每个Segment容量)

keyStrength==STRONG    valueStrength==STRONG

计算出:

entryFactory==STRONG_WRITE

segmentCount==4:Segment个数,一个刚刚大于等于concurrency_level且是2的几次方的一个数

segmentCapacity==initial_capcity/segmentCount==4:用来计算每个Segment能放置的entry个数的一个值,一个刚刚等于initial_capcity/segmentCount或者比initial_capcity/segmentCount大1的数(关键看是否除尽)

segmentSize==4:每个Segment能放置的entry个数,刚刚>=segmentCapacity&&是2的几次方的数

segments==Segment[segmentCount]==Segment[4]

segments[i]:

  • 包含一个ReferenceEntry[segmentSize]==ReferenceEntry[4]

  • WriteQueue:用于LRU算法的队列

  • threshold==newTable.length()*3/4==segmentSize*3/4==3:每个Segment中有了3个Entry(key-value),就会扩容,扩容机制以后在添加Entry的时候再讲

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击。

相关文章:
【推荐】 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
【推荐】 JVM锁实现探究2:synchronized深探

Google guava cache源码解析1--构建缓存器(3)相关推荐

  1. Google guava cache源码解析1--构建缓存器(2)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. CacheBuilder-->maximumSize(long size) /*** 指定cache中 ...

  2. [源码解析] PyTorch分布式优化器(1)----基石篇

    [源码解析] PyTorch分布式优化器(1)----基石篇 文章目录 [源码解析] PyTorch分布式优化器(1)----基石篇 0x00 摘要 0x01 从问题出发 1.1 示例 1.2 问题点 ...

  3. Spring MVC源码解析——HandlerMapping(处理器映射器)

    Sping MVC 源码解析--HandlerMapping处理器映射器 1. 什么是HandlerMapping 2. HandlerMapping 2.1 HandlerMapping初始化 2. ...

  4. postgres 源码解析25 缓冲池管理器-3

      本文讲解缓冲块的选择策略BufferAlloc,同时该函数也是替换策略的核心函数, 知识回顾: postgres源码解析 缓冲池管理–1 postgres源码解析 缓冲池管理–2 总结<执行 ...

  5. postgres 源码解析11 CLOG管理器--2

      在本小节中,着重讲解CLOG日志的读写操作,获取事务的状态信息进行可见性判断内容,相关背景知识见回顾通道: 1 postgres CLOG源码解析-1 2 postgres源码分析 Slru缓冲池 ...

  6. 2.MyBatis源码解析-SqlSession构建流程--阿呆中二

    SqlSession构建流程 MyBatis SqlSession构建流程 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSe ...

  7. OkHttp 3.x 源码解析之Dispatcher分发器

    Dispatcher概念 Dispatcher中文是分发器的意思,和拦截器不同的是分发器不做Aaction事件处理.只做事件流向.在Okhttp中Dispatcher负责将每一次Requst进行分发, ...

  8. postgres 源码解析9 CLOG管理器--1

    1 背景介绍   在Postgres数据库的日志管理系统中,采用CLOG日志记录集群中每个事务的最终状态,在内存中形式是基于SLRU缓冲实现的,有兴趣的回顾下SLRU相关知识:   1 postgre ...

  9. Google Archive Patch 源码解析

    如果你觉得本篇文章太长,可以直接看我总结的结论: Google Archive Patch是严格的基于Zip文件格式的差量算法,其核心生成差量的算法还是BsDiff,核心合成文件的算法还是BsPatc ...

最新文章

  1. Linux查看文件编码格式及文件编码转换
  2. python中文解释-python注释和2版本的中文乱码
  3. java代码调用python_java 直接调用python脚本,并传递参数代码实例|chu
  4. eclipse tomcat jsp乱码
  5. 【Python】可视化的离散傅里叶变换+快速傅里叶变换后时域信号的频域分析
  6. 3dm游戏运行包_权势纵横捭阖,战场龙血玄黄!三国志14火爆来袭电脑游戏
  7. 分享几个下载豆瓣资源的chrome插件
  8. 打印机驱动无法安装到计算机是,打印机驱动无法安装、安装失败、安装不上的解决办法...
  9. wav转mp3怎么转?
  10. 错误数据(图片)去除
  11. spider pi 智能视觉六足机器人 开箱介绍 0602
  12. 阿里云服务器部署学习笔记
  13. layui表格点击按钮下方新增加空白行
  14. c语言位域变量定义,C语言位域_Lee_1985的博客的技术博客_51CTO博客
  15. 中层管理者如何做好员工管理
  16. 配置log4j2.xml输出MyBatis的SQL日志
  17. PHP 开发社区微信服务号实战图解
  18. H265/HEVC编码NAL的单元的介绍
  19. python opencv入门 Meanshift 和 Camshift 算法(40)
  20. Go安装报错The installer has insufficient privileges to access thisdirectory: C:\ProgramData\.. 的解决方法

热门文章

  1. spring 依赖注入
  2. Xcode7 运行iOS10以上系统(10.1、10.2、10.3)解决Could not find Developer Disk Image
  3. Android DDMS应用
  4. OTP gen_server
  5. 无缝滚动—marquee实现向上滚动(适合发布通告)
  6. [铁道部信息化管理]号外
  7. 如何在网页中添加flash文件
  8. DM642图像平移程序学习
  9. 双11个性化推荐背后,阿里云“舜天”如何应对百亿次挑战?
  10. C语言函数指针的使用