浅析本地缓存技术-Guava Cache | 京东物流技术团队

46 篇文章 3 订阅
1 篇文章 0 订阅

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依赖:

xml复制代码<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

接下来写一个简单的示例:

scss复制代码Cache<String, String> localCache = CacheBuilder.newBuilder()
                .initialCapacity(5)
                .maximumSize(10)
                .concurrencyLevel(3)
                .expireAfterWrite(10, TimeUnit.SECONDS)
                .build();

以上示例实例化了一个本地缓存,接下来介绍一下初始化的各项参数的含义:
initialCapacity:内部哈希表的最小容量,也就是cache的初始容量。

maximumSize:cache的最大缓存数。

concurrencyLevel:并发等级,也可以定义为同时操作缓存的线程数,由

 

可以看出,这个线程数默认为4。

expireAfterWrite:缓存写入后刷新时间。

从缓存中获取数据调用的方法为get(K key, Callable<? extends V> loader)方法,此方法的含义是根据键key获取数据,若key不存在,则通过执行指定的Callable方法来构造缓存,示例代码如下所示:

typescript复制代码Map<String, Dicdetail> dicDetailMap = ObLocateCache.locateConfigCache.get(key.toString(), new Callable<Map<String, Dicdetail>>() {
                @Override
                public Map<String, Dicdetail> call() throws Exception {
                    return getConfigParameterFromMaster(baseDomain, KeyConstants.WMS5_LOCATE_MANUAL);
                }
            });

从cache中删除数据分为被动删除和主动删除两种:

1.被动删除:

  • 基于数据大小删除:LRU+FIFO
  • 基于过期时间删除:在指定时间内没有被访问
  • 基于引用删除:通过weakKeys和weakValues方法指定Cache只保存对缓存记录key和value的弱引用。这样当没有其他强引用指向key和value时,key和value对象就会被垃圾回收器回收

2.主动删除:

less复制代码//删除指定的key对应数据
cache.invalidate("s");
//将一批对应的数据删除
cache.invalidateAll(Arrays.asList("st","r","ing"));
//全部删除
cache.invalidateAll();

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有一个大致的认知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值