Guava Cache源码剖析

Guava Cache源码剖析

GuavaCache源码剖析之实现框架

在这里插入图片描述

  • CacheBuilder:类,缓存构建器。构建缓存的入口,指定缓存配置参数并初始化本地缓存。
    CacheBuilder在build方法中,会把前面设置的参数,全部传递给LocalCache,它自己实际不参与
    任何计算
  • CacheLoader:抽象类。用于从数据源加载数据,定义load、reload、loadAll等操作
  • Cache:接口,定义get、put、invalidate等操作,这里只有缓存增删改的操作,没有数据加载的
    操作
  • LoadingCache:接口,继承自Cache。定义get、getUnchecked、getAll等操作,这些操作都会
    从数据源load数据
  • LocalCache:类。整个guava cache的核心类,包含了guava cache的数据结构以及基本的缓存的
    操作方法
  • LocalManualCache:LocalCache内部静态类,实现Cache接口。其内部的增删改缓存操作全部调
    用成员变量localCache(LocalCache类型)的相应方法
  • LocalLoadingCache:LocalCache内部静态类,继承自LocalManualCache类,实现
    LoadingCache接口。其所有操作也是调用成员变量localCache(LocalCache类型)的相应方法

LocalCache

LoadingCache这些类表示获取Cache的方式,可以有多种方式,但是它们的方法最终调用到
LocalCache的方法,LocalCache是Guava Cache的核心类。

class LocalCache<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V>

LocalCache为Guava Cache的核心类 LocalCache的数据结构与ConcurrentHashMap很相似,都由多
个segment组成,且各segment相对独立,互不影响,所以能支持并行操作。

//Map的数组
final Segment<K, V>[] segments;
//并发量,即segments数组的大小
final int concurrencyLevel;
...
//访问后的过期时间,设置了expireAfterAccess就有
final long expireAfterAccessNanos;
//写入后的过期时间,设置了expireAfterWrite就有
final long expireAfterWriteNa就有nos;
//刷新时间,设置了refreshAfterWrite就有
final long refreshNanos;
//removal的事件队列,缓存过期后先放到该队列
final Queue<RemovalNotification<K, V>> removalNotificationQueue;
//设置的removalListener
final RemovalListener<K, V> removalListener;
...

每个segment由一个table和若干队列组成。缓存数据存储在table中,其类型为
AtomicReferenceArray。

GuavaCache源码剖析之CacheBuilder

缓存构建器。构建缓存的入口,指定缓存配置参数并初始化本地缓存。
主要采用builder的模式,CacheBuilder的每一个方法都返回这个CacheBuilder知道build方法的调用。
注意build方法有重载,带有参数的为构建一个具有数据加载功能的缓存,不带参数的构建一个没有数
据加载功能的缓存

GuavaCache源码剖析之Put流程

1、上锁
2、清除队列元素
清理的是keyReferenceQueue和valueReferenceQueue这两个队列,这两个队列是引用队列
如果发现key或者value被GC了,那么会在put的时候触发清理
3、setvalue方法了,它做的是将value写入Entry

GuavaCache源码剖析之Get流程
  1. 获取对象引用(引用可能是非alive的,比如是需要失效的、比如是loading的);
  2. 判断对象引用是否是alive的(如果entry是非法的、部分回收的、loading状态、需要失效的,则
    认为不是alive)。
  3. 如果对象是alive的,如果设置refresh,则异步刷新查询value,然后等待返回最新value。
  4. 针对不是alive的,但却是在loading的,等待loading完成(阻塞等待)。
  5. 这里如果value还没有拿到,则查询loader方法获取对应的值(阻塞获取)。
GuavaCache源码剖析之过期重载

数据过期不会自动重载,而是通过get操作时执行过期重载。具体就是CacheBuilder构造的
LocalLoadingCache

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值