携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
guava-cache实现本地缓存
前文
正常的开发过程中经常会用到redis等缓存中间件,而在某些情况下也需要进行本地缓存。本文的内容主要是使用guava-cache实现本地缓存,也就是将缓存的内容缓存到本地的jvm内存中。
如何使用guava-cache
首先需要引入pom包:
<dependency>
<groupId>com.diffplug.guava</groupId>
<artifactId>guava-cache</artifactId>
<version>19.0.0</version>
</dependency>
这里采用的是19.0.0版本,也是目前maven中搜索到的最新版本。
再看一下在代码中如何进行应用:
CacheBuilder cacheBuilder = CacheBuilder.newBuilder().concurrencyLevel(10).expireAfterAccess(1000, TimeUnit.HOURS);
Cache<String,String> cache = cacheBuilder.build();
cache.put("key","data");
String value = cache.getIfPresent("key");
cache.invalidate("key");
String value1 = cache.getIfPresent("key");
上面是一个简单应用的例子,首先需要进行缓存构造器的初始化操作。在构造器的初始化阶段有一些参数可以进行指定,后面再来看这部分。再以下的几行代码也就是利用工具进行缓存的存取,存取时的语法与我们进行map操作的存取类似。其实guava-cache的底层核心组件也就是ConcurrentMap,因此操作的语法也非常类似。
guava-cache的核心原理
核心原理说来也简单,主要是利用ConcurrentMap来进行读取。但这个包比较优秀的地方在于对于高并发情况下的兼容操作,下面也会对这部分进行一下分析。首先是在构造器的初始化阶段,可以进行并发参数的指定,设置并发等级。并发等级意味着同时允许多少个并发进行数据的更新。现在的设计是采用不同的并发表段,每个段内进行自己的加锁解锁操作,互不干扰来提高执行效率。
再来看一下实际上更新阶段的逻辑。根据源码可以看到,每一次的更新操作都会先获取段锁进行锁定。也是按照这种思路,实现了并发阶段的控制。如果自行设计本地缓存,也需要考虑并发控制的问题。
另外,guava-cache还支持设置缓存的过期时间等,根据缓存淘汰策略来做到不同方式的缓存更新。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。