Guava Cache实现原理——开篇&基本实现

Cuava Cache系列:

1、Guava Cache实现原理——开篇&基本原理

2、Guava Cache实现原理——LRU回收实现(敬请期待...)

3、Guava Cache实现原理——引用类型回收(敬请期待...)

4、Guava Cache实现原理——高效回收技巧(敬请期待...)

 

目录

一、前言

二、实现

1、Guava Cache是什么

2、如何做到高效读写

3、缓存项数量和容量大小限制实现

三、总结

四、惯例


 

一、前言

在高并发场景下我们很多场景都会使用缓存来抗高并发。通常的做法都是使用redis等分布式缓存+本地二级缓存方案来解决。即首先读取分布式缓存,如果分布式缓存挂了,则降级读取作为二级缓存的本地缓存。在实现本地缓存的时候,我们通常也不会闭门造车,而是使用Google大神提供的Guava Cache。本系列文章将和大家一起对Guava Cache实现原理和技巧进行探索。

本系列文章不会从代码基本开始分析,因为网上已经有很多大神做过类似分析。我们将在对Guava Cache代码有一定的理解基础上对Guava Cache的实现和设计技巧做进一步探索和概括。所以本系列文章需要大家对Guava Cache源码有一定了解。

本系列文章规划了如下四篇:

1、Guava Cache实现原理——开篇&基本原理

2、Guava Cache实现原理——LRU回收实现

3、Guava Cache实现原理——引用类型回收

4、Guava Cache实现原理——高效回收技巧

 

那么本文接下来将和大家一起对Guava Cache做一个基本的了解和回顾。

二、实现

1、Guava Cache是什么

Guava Cache就是由Google大神开发的一个本地缓存组件。其可以指定缓存的容量大小或者指定缓存的缓存项大小,能够设置缓存项目的过期时间,能够设置key或者value为弱引用。与此同时Guava Cache能够根据这些设置在合适的时候对缓存项进行回收。

Guava Cache本身几乎没有主动回收的操作,即不会自己看线程来对不符合条件的(如过期)的缓存项进行回收。几乎都是被动回收,即当读取某个缓存项的时候才去判断它是否过期等,然后再回收,并重新加载新的缓存项。

其实Guava Cache本身也提供了invalidate方法来让使用者自己回收某些缓存项,但是笔者并不建议在生产环境中频繁地执行这样操作。因为invalidate操作与缓存读写有锁竞争,频繁的操作会影响线上缓存的读写性能。

2、如何做到高效读写

其实看过源码的同学都应该知道,Guava Cache借鉴了ConcurrentHashMap的实现原理(基于1.7版本的实现,即没有使用红黑树),使用了桶+链表的方式来实现。其这部分实现代码逻辑集合都和ConcurrentHashMap一样。如下是新增缓存项的一段代码,是不是很ConcurrentHashMap很像呢。

所以Guava Cache借鉴了ConcurrentHashMap的思想(甚至代码结构和实现都差不多),通过分段锁的方式解决了高并发读写的问题。

3、缓存项数量和容量大小限制实现

用过Guava Cache的同学都应该知道,在Guava Cache中缓存项数量大小和缓存总容量大小只能设置一个,二者不能并存。

这是因为在Guava Cache中这二者的实现都是通过权重来实现的。其实实现很简单,实现容量大小限制的时候,通过maximumWeight来设置总容量大小,然后通过weigher函数来计算并告诉Guava Cache每个缓存项的容量大小。这样Guava Cache就只需要将所有的缓存项目的权重值相加就能够知道其是否超过最大容量限制了(当然代码实现的时候并不需要每次判断都加一次,而是有一个标记当前缓存中缓存项权重大小的变量)。

在实现缓存项数据量大小限制的时候,虽然是通过maximumSize来指定的最大缓存项数据量。其实底层使用了和权重相同的代码逻辑实现,只是这里每个缓存项的权重为1。

三、总结

到这里我们已经知道了Guava Cache的基本实现了。

1、为了性能考虑,其没有提供主动回收缓存项的功能

2、通过借鉴ConcurrentHashMap的分段锁思想实现了高并发

3、使用缓存项权重实现了缓存项数量限制和缓存项大小限制

由于这些实现相对都比较简单,网上也有很多类似的分析文章,所以本文并没有详细的介绍。如果还有不是很了解的同学,可以自行搜索相关文章。

此时我们就知道了元素是怎么添加(ConcurrentHashMap的put逻辑)到本地缓存中去的了,后续我们将重点介绍Guava Cache的淘汰和回收机制。

 

四、惯例

如果你对本文有任何疑问或者高见,欢迎添加公众号共同交流探讨(添加公众号可以获得”Java高级架构“上10G的视频和图文资料哦)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳小闹成长记-跳爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值