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✕ 的写入速度。您的情况可能会有所不同,但可以肯定的是,简单的缓存可以提供显着的性能优势。
因此,如果您的用例允许,请试用简单缓存并告诉我们。就像一个配置属性一样简单!