CaffeineCache Api介绍以及与Guava Cache性能对比| 京东物流技术团队

CaffeineCache Api介绍以及与Guava Cache性能对比| 京东物流技术团队

💡 原文中文,约16600字,阅读约需40分钟。
📝

内容提要

CaffeineCache是基于Guava Cache开发的高性能本地缓存,适用于存储数据库查询结果和接口返回值。它支持多种缓存添加策略,如手动加载、自动加载和异步加载。Caffeine的驱逐策略包括基于容量、时间和权重,性能优于Guava Cache。本文提供了多种使用示例,展示了Caffeine的操作和性能优势,适合开发者在本地缓存场景中使用。

🔎

延伸解读

异常处理:cache.get 不会返回 null

文章通过示例验证了当缓存加载函数抛出异常时,cache.get 并不会如官方文档所说返回 null,而是直接抛出异常。这意味着开发者不能依赖返回 null 来处理加载失败,而应该使用 try-catch 捕获异常,并根据业务需求决定是降级、重试还是向上抛出。

刷新机制:访问触发与旧值返回

Caffeine 的 refreshAfterWrite 不会在过期后立即刷新,而是在下一次访问时触发刷新,且刷新期间返回旧值,直到刷新完成。这可能导致短暂的数据不一致,适合对实时性要求不高的场景。若需要强一致性,应结合手动刷新或使用 expireAfterWrite 强制过期。

驱逐监听器:removalListener 与 evictionListener

文章通过示例表明,removalListener 在元素被驱逐或手动移除时都会触发,而 evictionListener 仅在元素被驱逐时触发。开发者应根据业务需求选择:若需要记录所有移除操作(包括手动清除),使用 removalListener;若只关心自动驱逐,则使用 evictionListener。

性能对比:Caffeine 总体优于 Guava Cache

文章在 Apple M3、18GB 内存、JDK1.8 环境下进行了多组测试,结果显示 Caffeine 在存、取、删操作上的总体性能均优于 Guava Cache,尤其在读操作上优势明显。但作者也指出,这是基于本地单机的简单测试,结果受硬件和线程影响较大,建议参考官方测试以获得更可靠的结论。

❓

Q&A

CaffeineCache与Guava Cache的主要区别是什么?

CaffeineCache是基于Guava Cache开发的高性能本地缓存,性能优于Guava Cache,适合存储数据库查询结果和接口返回值。

CaffeineCache支持哪些缓存添加策略?

CaffeineCache支持手动加载、自动加载、手动异步加载和自动异步加载等多种缓存添加策略。

CaffeineCache的驱逐策略有哪些?

CaffeineCache的驱逐策略包括基于容量、时间和权重。

CaffeineCache的性能测试结果如何?

性能测试表明,CaffeineCache的总体性能优于Guava Cache,适合高效的本地缓存需求。

如何在CaffeineCache中实现异步加载?

可以使用AsyncCache类,通过cache.get(key, k -> getValue(key))实现异步加载,返回CompletableFuture。

CaffeineCache的移除操作有哪些?

CaffeineCache提供invalidate、invalidateAll和invalidateAll()等方法来移除缓存中的元素。

🏷️

标签

➡️

继续阅读