Infinispan 是由红帽(Red Hat)主导开发的开源分布式内存键值存储与数据网格平台, 用 Java 编写。它既可作为 Java 库嵌入应用进程运行, 也可作为独立服务通过 Hot Rod、REST、Memcached 等协议被多语言客户端远程访问, 常用于在数据库前承担分布式缓存, 或直接充当 NoSQL 数据存储。[1]
定义
Infinispan 是一种分布式内存键值数据存储, 也常被描述为数据网格平台。其数据模型是可选的, 不强制固定表结构, 键值对存放在集群各节点的内存之中, 并可选择性地写入持久化存储。[2]它以 Apache License 2.0 协议开源, 由红帽(Red Hat)开发, 是 JBoss Cache 的后继项目, 项目于 2009 年公布。[1]
它提供两种基本运行方式: 一是作为库嵌入 Java 应用, 二是以独立服务器形式对外提供远程访问。嵌入方式下, Infinispan 通过 JGroups 做点对点发现, 自动组成集群, 并暴露一个继承自 java.util.Map 的 Cache 接口; 远程方式下, 客户端通过二进制协议 Hot Rod 或 REST 接口连接服务器。在数据网格能力之外, 它还支持事务、事件通知、索引查询与分布式执行等功能。[2]
原理
集群中的键空间被切分为固定数量的段, 每段按一致性哈希算法分配到若干节点上, 这些节点称为该段的属主。相比每个节点都保存全量副本的复制模式, 这种方式让每份数据的写入代价与集群规模无关, 从而支持横向扩展; 节点失效时, 网格会在其他节点上重建丢失的副本。[3]
缓存操作沿拦截器链依次处理。持久化由两个拦截器接入: 读操作未命中内存数据容器时由 CacheLoaderInterceptor 从持久化存储载入; 写操作落到数据容器后由 CacheWriterInterceptor 同步或异步地传播到存储。[4]存储层通过 NonBlockingStore 接口实现, 并提供 JDBC、RocksDB、远程存储以及 Cassandra、MongoDB、HBase 等多种后端。[4]
网络分区发生时, 集群进入降级模式, 批量操作如 clear()、keySet() 会被拒绝, 因为它们在部分集群上无法保证完整性。分区合并时, JGroups 下发合并视图, 协调者收集各分区拓扑并选出拓扑编号最高的首选分区, 随后 ConflictManager 逐个段比对各副本取值, 由 EntryMergePolicy 决定胜出值, 内置策略包括 PREFERRED_ALWAYS、PREFERRED_NON_NULL、REMOVE_ALL 与 NONE。[4]
查询方面, Infinispan 使用 Ickle 查询语言, 它是 HQL/JPQL 的子集, 全文检索由 Apache Lucene 提供, 另支持面向向量嵌入的 kNN 相似度检索。事务支持 JTA 与 XA, 可参与由外部事务管理器协调的分布式事务, 也可关闭事务以换取更高吞吐。
发展历程
Infinispan 的项目于 2009 年公布, 用来接替此前的 JBoss Cache。它由红帽在 JBoss 社区内推进, 目标是构建跨多节点的分布式缓存技术, 以缓解事务型应用的性能瓶颈。[1]
2012 年, 红帽把该项目商业化为 JBoss Data Grid 6, 于当年 6 月发布, 面向高吞吐、低延迟的事务型负载, 例如交易、物流与电子商务应用。企业版产品在代码上与社区版 Infinispan 一致, 并整合了 JBoss 企业应用平台与 JBoss Operations Network 等组件。[5][6]此后红帽又陆续发布 Data Grid 6.5、7.0 等版本, 并逐步以红帽数据网格(Red Hat Data Grid)作为产品名称。[7]
从 Infinispan 8 开始, 除既有的 Hadoop、Spark 与 MapReduce 接口外, 还可使用 Java 8 的 Stream API 处理网格中的数据, 运算会借助数据分区逻辑被下发到数据所在节点本地执行。[8]近年该平台也扩展出面向向量检索的能力, 并提供与 LangChain4j、Spring AI、LangChain 的集成。
应用
最常见的用法是作为分布式缓存放在数据库或其它瓶颈系统之前, 降低读取延迟并减轻后端压力。集群部署时, 缓存数据在各节点之间自动保持一致。
它也可直接充当 NoSQL 数据存储, 把数据放在内存中并借助可插拔的缓存存储获得持久性。作为数据网格的一部分, 它还被用于存储 Web 会话等临时数据、跨 JVM 的共享存储以及内存中的数据分析。[1]
在框架集成方面, Infinispan 实现了 Hibernate ORM 的缓存 SPI, 可作为二级缓存跨集群缓存实体、集合与查询结果; Keycloak 与 WildFly 等框架用它做集群会话管理与故障转移。它同样可与 JCache(JSR-107)、Spring Cache、Spring Session、CDI、Apache Spark 与 Apache Hadoop 等集成。[2]
在学术与研究中, 它也被当作分布式执行与存储框架使用。例如 Cloud2Sim 借助它分布式执行 MapReduce 工作流与仿真, 医学影像共享同步平台 MEDIator 用它做分布式内存存储, Cassowary 则用它保存上下文信息, 为情境感知的智能建筑提供中间件支撑。[1]
局限
数据默认存放在内存中, 单集群可承载的数据量受各节点内存总和的约束。虽然可以通过缓存存储把数据溢出到磁盘, 或将其作为读写穿透层对接外部数据源, 但这样做会引入持久化访问的开销, 内存方案原有的低延迟优势会因此减弱。[4]
集群规模并非没有上限。有资料指出, 其扩展的限制实际上来自网络上的组通信, 主要成本花在新节点的发现上, 而数据访问采用节点间点对点直连的方式。[3][6]
一致性方面存在固有权衡。当集群发生网络分区, 系统会进入降级模式并拒绝批量操作, 以避免在部分集群上给出不完整的批量结果; 分区恢复后还需要通过合并策略解决各分区副本取值不一致的冲突。[4]另外, 事务并非强制启用, 关闭事务虽然可以提升吞吐, 但也意味着放弃 ACID 保证。
远程访问模式也有能力边界。有资料称, 在远程客户端-服务器模式下数据网格操作是非事务性的, 因此该模式下 Infinispan 的若干特性无法使用。[6]
参见
参考资料
- Infinispan [引用日期2026-10-14]
- == Introduction [引用日期2026-10-14]
- What is Infinispan? [引用日期2026-10-14]
- Infinispan Architecture Guide [引用日期2026-10-14]
- Red Hat releases NoSQL database for enterprise Java [引用日期2026-10-14]
- JBoss 系列二十六:JBoss Data Grid(Infinispan)简介 [引用日期2026-10-14]
- chap-introduction_to_red_hat_jboss_data_grid_6 [引用日期2026-10-14]
- voxxeddays.com 上的网页 [引用日期2026-10-14]