设想高并发下的一种场景:假设我们将name=aty存放到缓存中,并设置的有过期时间。当缓存过期后,恰好有10个客户端发起请求,需要读取name的值。使用Guava Cache可以保证只让一个线程去加载数据(比如从数据库中),而其他线程则等待这个线程的返回结果。这样就能避免大量用户请求穿透缓存。
import com.google.common.base.Stopwatch;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class Main {
// 1s无访问则缓存过期, 每次加载一个key需要耗时2s
private static LoadingCache<String, String> cache = CacheBuilder.newBuilder().expireAfterAccess(1, TimeUnit.SECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
System.out.println("begin to query db...");
Thread.sleep(2000);
System.out.println("success to q

在高并发场景下,Guava Cache能确保只有一个线程在缓存过期时加载数据,其他线程则等待其返回结果,有效防止大量请求穿透缓存。然而,这可能导致部分线程被阻塞,理想情况下,当发现数据正在加载时,其他线程可直接读取旧数据以提高系统吞吐量。
最低0.47元/天 解锁文章
2427





