咖啡因AsyncLoadingCache和迅雷群

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

sunnygirl126 回答:咖啡因AsyncLoadingCache和迅雷群

通过缓存加载时支持缓存踩踏。在使用getIfPresent并加载值的示例中,然后假定您将其显式放入fetchFromRedis内部的缓存中。无论哪种方式,您都可以确保通过绕过缓存来确保合理的get-load-put(除非Redis中没有)。

如果您猜想将逻辑移到asyncLoad中,它将使缓存处理踩踏事件。 redis查找,db查询以及存储回redis都可以作为一系列异步任务执行,其中最终的未来返回到asyncLoad。然后缓存将计算一次未来,并将其返回到所有后续调用,直到逐出该条目。

本文链接:https://www.f2er.com/2622969.html

大家都在问