Caffeine AsyncLoadingCache 上的 .get() 是否通过延迟调用 .get() 的后续线程直到第一个线程完成来防止并发加载?或者它可以配置为在发生自填充负载请求时返回一个陈旧的值?
这样可以通过使用缓存来防止雷鸣般的羊群。
我看到的行为表明即使我正在使用缓存,也没有处理雷鸣般的牛群。
我像这样创建缓存:
val queryResponseCache: AsyncLoadingCache<Request, Response> = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(5, TimeUnit.SECONDS)
.recordStats()
.buildAsync(queryLoader)
并将其与 redis 中的 L2 缓存一起使用,如下所示(kotlin elvis 运算符):
queryResponseCache.getIfPresent(key) ?: fetchFromRedis(key) ?: queryResponseCache.get(key)
我知道 getIfPresent 是并发的,但是最终调用 fetchFromRedis() / get() 的后续调用似乎有问题。我想将其fetchFromRedis
移入asyncLoad()
函数可能对负载容限更好。