Guava 本地缓存(Caches)

本文探讨了GuavaCache中两种不同的缓存刷新机制:expireAfterWrite与refreshAfterWrite。expireAfterWrite会在指定时间内未更新缓存时使其失效并重新加载;而refreshAfterWrite则在缓存项上次更新后的一段时间内异步刷新缓存,刷新过程中仍可返回旧值,提高性能。
1.    本地缓存采用的是Guava Cache的expireAfterWrite刷新机制。
 Guava Cache本地缓存基于expireAfterWrite刷新缓存机制。
1)expireAfterWrite缓存刷新是在指定的时间段内没有更新就会被回收。所以对缓存数据时效性高,可以考虑使用expireAfterWrite,使每次更新缓存后在指定时间让缓存失效,
然后重新加载缓存。而Guaua Cache会限制只有1个加载操作并且进行加锁,其他请求必须阻塞等待这个加载操作完成后,才能获得锁和获取缓存值,这样是有一些性能损耗。
                 2)在CacheLoader<K, V> 的V load(K var1)方法对返回值如果是Null是会抛异常(com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key hi.),
会造缓存刷新失败,所以必需要保证每次加载缓存的数据是非空的值。
 
²  考虑expireAfterWrite以上原因。首先小飞机服务项目缓存的数据都是基础数据,更新的时效性相对不高,所以更改另外一种刷新机制refreshAfterWrite(缓存项上一次更新操作之后多久时间会被定时刷新),
refreshAfterWrite刷新的过程是异步处理的(定时刷新时调用下面reload异步方法)。在刷新操作进行时,缓存值的获取仍然可以向其他线程返回旧值,并不会阻塞等待新值加载完成才能得到缓存值。
另外刷新过程抛出异常,缓存将保留旧值,异常信息可以记录在Clog日志。
CacheBuilder.newBuilder()
        .refreshAfterWrite(duration, unit)
        .build(new CacheLoader<String, T>() {
            @Override
            public T load(String key) throws Exception {
                // TODO
            }

            @Override
            public ListenableFuture<T> reload(final String key, T oldValue) {
               // TODO
            }
        });
 
03-16
### Google Guava 库简介 Google Guava 是由 Google 开发的一组 Java 核心库,它提供了许多实用的功能来简化开发过程并增强代码质量。这些功能涵盖了集合操作、缓存机制、并发支持以及字符串处理等多个方面[^2]。 #### 主要特性 Guava 提供了许多强大的工具类和方法,以下是其中一些核心模块: 1. **Collections utilities**: 扩展了标准的 Java 集合框架,增加了新的集合类型如 `Multiset` 和 `Multimap`,并且提供了一系列便捷的方法用于集合的操作[^3]。 2. **Caches**: 实现了一个简单的本地缓存解决方案,可以用来存储临时数据以提高性能[^4]。 3. **Functional programming idioms for Java**: 虽然 Java 8 引入了 lambda 表达式和支持函数式编程的能力,但在早期版本中,Guava 已经通过其 `Function`, `Predicate` 接口等方式实现了部分类似的抽象逻辑[^5]。 4. **Concurrency support**: 增强了多线程环境下的同步控制能力,比如引入了 `ListenableFuture` 来改进异步任务的结果获取方式[^6]。 5. **String manipulation methods**: 提供了一些非常方便的字符串处理方法,使得开发者能够更轻松地完成诸如分割、连接等常见任务[^7]。 下面是一个使用 Guava 中 `Splitter` 类的例子: ```java import com.google.common.base.Splitter; public class Example { public static void main(String[] args) { Iterable<String> result = Splitter.on(',') .trimResults() .omitEmptyStrings() .split("apple, orange,, banana"); System.out.println(result); // 输出: [apple, orange, banana] } } ``` 此代码片段展示了如何利用 Guava 的 `Splitter` 对复杂的分隔符场景进行高效而简洁的解析[^8]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值