gpt4 book ai didi

java - 是否可以按插入/访问顺序迭代 Guava 缓存?

转载 作者:搜寻专家 更新时间:2023-11-01 02:45:58 25 4
gpt4 key购买 nike

我正在尝试使用 Guava 缓存来替代 ConcurrentLinkedHashMap .但是我发现虽然 ConcurrentLinkedHashMap 允许我按插入顺序遍历 map ,但 Guava 的 asMap() 方法不会以任何特定顺序返回元素。我是否遗漏了什么,或者此功能根本不可用?

示例(尝试打印键、值和条目):

Cache<Integer, Integer> cache = CacheBuilder.newBuilder().maximumSize(10).initialCapacity(10)
.expireAfterAccess(10000, TimeUnit.SECONDS).build();

cache.put(1, 1);
cache.put(2, 2);
cache.put(3, 3);
cache.put(4, 4);
cache.put(5, 5);
cache.put(6, 6);

Iterator<Integer> iter1 = cache.asMap().keySet().iterator();

System.out.println("Keys");
while (iter1.hasNext())
System.out.println(iter1.next());

System.out.println("Values");
Iterator<Integer> iter2 = cache.asMap().values().iterator();

while (iter2.hasNext())
System.out.println(iter2.next());

System.out.println("Entries");
Iterator<Entry<Integer, Integer>> iter3 = cache.asMap().entrySet().iterator();

while (iter3.hasNext()) {
Entry<Integer,Integer> entry = iter3.next();
System.out.println(entry.getKey() + " " + entry.getValue());
}

打印:

Keys
2
6
1
4
3
5
Values
2
6
1
4
3
5
Entries
2 2
6 6
1 1
4 4
3 3
5 5

最佳答案

CacheWriter 将允许您的代码在显式写入或删除期间被调用。对于加载缓存,您必须在加载程序中执行相同的工作。这也是在条目的锁下执行的,因此您可以假定原子性。这应该让您在不依赖缓存的内部数据结构的情况下维护顺序。请注意,如果执行有序迭代时的工作开销很大,您可能希望将其复制到锁内,然后在锁外执行工作,以免阻塞缓存写入。

LinkedHashMap<K, V> orderedMap = new LinkedHashMap<>();
LoadingCache<K, V> cache = Caffeine.newBuilder()
.writer(new CacheWriter<K, V>() {
public void write(K key, V value) {
synchronized (orderedMap) {
orderedMap.put(key, value);
}
}
public void delete(K key, V value, RemovalCause cause) {
if (cause == RemovalCause.REPLACED) {
return;
}
synchronized (orderedMap) {
orderedMap.remove(key);
}
}
})
.maximumSize(1_000)
.build(key -> {
V value = ...
synchronized (orderedMap) {
orderedMap.put(key, value);
}
return value;
});

cache.put(key1, value); // calls writer under lock
cache.get(key2); // calls loader under lock; not writer
cache.invalidate(key1); // calls writer under lock
cache.policy().eviction().get().setMaximum(0); // calls writer under lock

synchronized (orderedMap) {
for (K key : orderedMap.keySet()) {
// do work, but blocks writes!
}
}

关于java - 是否可以按插入/访问顺序迭代 Guava 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com