gpt4 book ai didi

java非阻塞缓存实现

转载 作者:行者123 更新时间:2023-12-02 01:28:48 25 4
gpt4 key购买 nike

(请注意,我不能使用外部库进行缓存)。

---可以使用流API来完成吗? ---

我需要实现一个缓存,它有 1 个关键属性:

如果缓存被要求提供一个它不包含的键,它应该使用外部提供的函数来获取数据,该函数从另一个源(数据库或类似的)读取数据。

我已经开始创建基本的骨架代码:

public interface ICache<K,V> {
}

interface IDataSource<K,V> {
void put(K key, V value);
V get(K key);
}


public class Cache<K,V> implements ICache<K,V> {
Map<K,V> cache = new HashMap<>();
IDataSource<K,V> dataSource;


public Cache(IDataSource<K,V> dataSrc) {
dataSource = dataSrc;
}

//may it change to a future? how it can be done?
public V getAsync(K key) {
if (cache.containsKey(key)) {
return cache.get(key);
}
else {
//do some async op
}
}
}

你能给点建议吗?

您认为它需要更多功能吗?

最佳答案

实际上,您所写的是一个懒惰的评估器。您正在为该值提供一个 Supplier,而不是第一次计算它。当有人询问您的值时,您会计算它并返回它,并记住(缓存)它以供将来使用。

看看 Vavr 的 Lazy 类,它正是这样做的(但是对于单个值)。您可以从正在执行的操作中获取一些想法,以及一些额外的实用方法,例如检查它是否已经计算。

https://github.com/vavr-io/vavr/blob/master/vavr/src/main/java/io/vavr/Lazy.java

另一种选择是简单地使用ConcurrentHashMap。如果值不在 map 中,它提供了安全(原子)更新值的方法。

如果你希望它是异步的,你需要引入一些ExecutorService或使用CompletableFuture(使用你自己的ExecutorService或默认线程池由并行流等使用)。例如:

public class Cache<K,V> implements ICache<K,V> {
Map<K,V> cache = new ConcurrentHashMap<>();
IDataSource<K,V> dataSource;

public Cache(IDataSource<K,V> dataSrc) {
dataSource = dataSrc;
}

// async non-blocking call
public CompletableFuture<V> getAsync(K key) {
return CompletableFuture.supplyAsync(() -> get(key));
}

// blocking call
public V get(K key) {
//computeIfAbsent is atomic and threadsafe, in case multiple CompletableFutures try this in parallel
return cache.computeIfAbsent(key, (k) -> dataSource.get(k));
}
}

如果您还想要异步直接缓存和数据源更新,您可以执行以下操作:

  public CompletableFuture<Void> putAsync(K key, V value) {
return CompletableFuture.runAsync(() -> {
synchronized (cache) {
dataSource.put(key, value);
cache.put(key, value);
}
}
}

尽管说实话,我会避免使用 2 个入口点来更新 dataSource(直接缓存和 dataSource)。此外,如果没有同步(这会完全阻止并发缓存放置,即使 key 不同),也很难使其完全线程安全。

关于java非阻塞缓存实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56440650/

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