浅析本地缓存技术 -Guava Cache | 京东物流技术团队
1 引言
作为 java 开发工作者,相信大家对于 guava 这个工具包都不会太陌生,而对于本地缓存技术 guava cache,大家在日常的工作开发中也都有所了解,接下来本文就从各个角度入手来对于 Google 提供的 guava cache 进行解析。
2 guava cache 应用场景
本地缓存的数据读写都在一个进程内,相对与 redis 等分布式缓存,不需要网络传输的过程,访问速度很快,同时也受到 JVM 内存的制约,无法在数据量较多的场景下使用。
基于以上特点,guava cache 的主要应用场景为以下几种:
对于访问速度有较大要求
存储的数据不经常变化
数据量不大,占用内存较小
需要访问整个集合
能够容忍数据不是实时的
在这里 guava cache 被用于储存参数配置,也符合以上的应用场景条件。
3 guava cache 的使用方式
guava cache 位于 com.google.common.cache 包下,核心的类有两个,一个是 CacheBuilder,是用来构建缓存的,另一个是 Cache,也就是缓存容器,用来存放缓存数据的。
要使用 guava cache,首先要引入 maven 依赖:
接下来写一个简单的示例:
以上示例实例化了一个本地缓存,接下来介绍一下初始化的各项参数的含义:
initialCapacity:内部哈希表的最小容量,也就是 cache 的初始容量。
maximumSize:cache 的最大缓存数。
concurrencyLevel:并发等级,也可以定义为同时操作缓存的线程数,由
可以看出,这个线程数默认为 4。
expireAfterWrite:缓存写入后刷新时间。
从缓存中获取数据调用的方法为 get(K key, Callable<? extends V> loader)方法,此方法的含义是根据键 key 获取数据,若 key 不存在,则通过执行指定的 Callable 方法来构造缓存,示例代码如下所示:
从 cache 中删除数据分为被动删除和主动删除两种:
1.被动删除:
基于数据大小删除:LRU+FIFO
基于过期时间删除:在指定时间内没有被访问
基于引用删除:通过 weakKeys 和 weakValues 方法指定 Cache 只保存对缓存记录 key 和 value 的弱引用。这样当没有其他强引用指向 key 和 value 时,key 和 value 对象就会被垃圾回收器回收
2.主动删除:
4 根据源码分析 guava cache 的存储原理
guava cache 的数据结构跟 ConcurrentHashMap 类似,二者最基本的区别是 ConcurrentMap 会一直保存所有添加的元素,直至将添加的元素移除。相对地,guava cache 为了限制内存占用,通常都设定为自动回收元素。
guava cache 的核心类为 LocalCache,LocalCache 实现了 ConcurrentMap 接口。其中有一个 Segment 数组,如下所示
获取数据的方法源码如下图所示,可以看出 guava cache 的存储原理为由 Segment 数组加上 ReferenceEntry 链表加上 AtomicReferenceArray 数组组成的数据结构。
数据结构图如下所示:
Segement 数组的长度决定了 cache 的并发数。每一个 Segment 都继承了 ReentrantLock,使用了单独的锁,对 Segment 的写操作需要先拿到锁。写操作部分源码如下所示:
5 总结
本文简要叙述了 guava cache 的应用场景以及简单的使用方式,通过源码对于 guava cache 的存储原理以及简单的读写方法进行了介绍。相信通过阅读本文,能够对于常见的 guava cache 有一个大致的认知。
作者:京东物流 王辰玮
来源:京东云开发者社区 自猿其说 Tech
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/eb826bde881bb7cc8f0a0ce59】。文章转载请联系作者。
评论