在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()
函数中可能会更好地提高负载承受能力。