Infinispan 缓存比较和对比

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

Infinispan 本地缓存 有几个特性,使其不仅仅是一个映射——过期和逐出、侦听器、统计信息、事务、缓存存储等等。然而,这是有代价的——由于所有的钩子和对象分配,普通的 ConcurrentHashMap 比本地缓存更快。

有些应用程序需要介于两者之间的东西——出色的性能,但也需要其中的一些特性。在我们的例子中,动机是 Hibernate 二级缓存中的内部缓存。因此,Infinispan 8.0.1.Final 带来了 简单的缓存 AdvancedCache 接口的替代实现,当您只需要基础知识时,它已针对最大性能进行了优化。

下表显示了简单缓存中可用的功能:

特征 可用性
基本的类似地图的 API
缓存侦听器(非集群)
过期
驱逐
安全
JMX访问
统计数据
交易
调用批处理
持久性(缓存存储和加载器)
地图减少框架
分布式执行器框架
自定义拦截器
索引(查询)
兼容性(嵌入式/服务器)
存储为二进制

配置一个简单的缓存就像在 XML 配置中添加一个属性一样简单:


 <local-cache name="mySimpleCache" simple-cache="true">
  <!-- expiration, eviction, security... -->
</local-cache>

虽然配置模式允许设置不受支持的功能,但这样做会在创建缓存时导致异常。

您还可以通过编程方式配置简单缓存:


 <local-cache name="mySimpleCache" simple-cache="true">
  <!-- expiration, eviction, security... -->
</local-cache>


那么,您可以期待什么样的性能改进?我们已经使用 JMH 运行了一个基本的(单线程)基准测试,这就是我们得到的:

执行 get()(操作/秒) put()(操作/秒)
ConcurrentHashMap 128,354,135 ± 2,178,755 33,980,088 ± 28,487
简单缓存 86,969,897 ± 738,935 14,044,642 ± 14,280
本地缓存 17,280,018 ± 361,910 2,267,850 ± 44,814

这为我们提供了大约 5✕ 的读取速度和 6✕ 的写入速度。您的情况可能会有所不同,但可以肯定的是,简单的缓存可以提供显着的性能优势。

因此,如果您的用例允许,请试用简单缓存并告诉我们。就像一个配置属性一样简单!