java – 如何将条目填充到Loading Cache guava中?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何将条目填充到Loading Cache guava中?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2399字,纯文字阅读大概需要4分钟。
内容图文
![java – 如何将条目填充到Loading Cache guava中?](/upload/InfoBanner/zyjiaocheng/757/268a810327e0448398f76d02bd6afa09.jpg)
我有一个用例,我希望从多个线程将条目填充到数据结构中,并在达到特定大小后开始删除旧记录.所以我决定使用Guava Loading Cache.
我想从多个线程将条目填充到我的加载缓存中,并且我将基于驱逐的策略设置为基于大小的驱逐.
private final ScheduledExecutorService executorService = Executors
.newSingleThreadScheduledExecutor();
private final LoadingCache<String, DataBuilder> cache =
CacheBuilder.newBuilder().maximumSize(10000000)
.removalListener(RemovalListeners.asynchronous(new CustomListener(), executorService))
.build(new CacheLoader<String, DataBuilder>() {
@Override
public DataBuilder load(String key) throws Exception {
// what I should do here?
// return
}
});
// this will be called from multiple threads to populate the cache
public void addToCache(String key, DataBuilder dataBuilder) {
// what I should do here?
//cache.get(key).
}
我的addToCache方法将从多个线程调用以填充缓存.我混淆了我应该在addToCache方法中做什么来填充缓存,以及我的加载方法是什么样的?
这里DataBuilder是我的构建器模式.
解决方法:
显然你的问题是你没有得到CacheLoader的主要目的.
CacheLoader用于在调用get(K key)或getUnchecked(K key)时自动加载给定键的值(在缓存中不存在),即使我们有多个线程试图同时获取相同键的值时间,只有一个线程实际上会加载该值,一旦完成所有调用线程将具有相同的值.
当要加载的值需要一些时间时,这通常很有用,例如,当它是数据库访问或长计算的结果时,因为需要的时间越长,有多个线程尝试加载相同值的可能性越大在没有确保只有一个线程将为所有调用线程加载数据的机制的情况下浪费资源的同时.
所以这里假设您的DataBuilder的实例很难构建,或者您只需要确保所有线程都具有给定键的相同实例,那么您确实需要一个CacheLoader,它看起来像这样:
new CacheLoader<String, DataBuilder>() {
@Override
public DataBuilder load(String key) throws Exception {
return callSomeMethodToBuildItFromTheKey(key); // could be new DataBuilder(key)
}
}
由于CacheLoader,您不再需要显式调用put,因为调用cache.get(myKey)或cache.getUnchecked(myKey)的线程将在场景后面填充缓存.
如果要手动填充缓存,可以像下一个Cache一样使用put(K key, V value)方法:
public void addToCache(String key, DataBuilder dataBuilder) {
cache.put(key, dataBuilder);
}
如果你打算自己填充缓存,你不需要CacheLoader,你可以简单地调用build()而不是build(CacheLoader<?super K1,V1> loader)来构建你的Cache实例(它不再是一个LoadingCache了) ).
您的代码将是:
private final Cache<String, DataBuilder> cache =
CacheBuilder.newBuilder().maximumSize(10000000)
.removalListener(
RemovalListeners.asynchronous(new CustomListener(), executorService)
).build();
内容总结
以上是互联网集市为您收集整理的java – 如何将条目填充到Loading Cache guava中?全部内容,希望文章能够帮你解决java – 如何将条目填充到Loading Cache guava中?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。