Infinispan缓存使用与配置全解析
立即解锁
发布时间: 2025-08-18 01:39:07 阅读量: 2 订阅数: 4 

### Infinispan缓存使用与配置全解析
#### 1. Infinispan架构概述
从用户角度来看,最终用户应用程序(如Web浏览器)可通过缓存接口与数据网格进行交互。这里所说的“网格”,是Infinispan基础设施的一部分,用于协调资源共享,存储和管理基于映射的缓存,这些缓存包含网格的数据。基于映射的缓存的关键抽象在于它可以进行分区,即可以拆分成多个部分,分布在不同容器的多个实例中。
#### 2. Infinispan集群缓存剖析
与Infinispan交互有两种方式:
- **嵌入式(P2P)模式**:Infinispan在与应用程序逻辑相同的JVM中运行,集群中的每个JVM都会运行一个单独的Infinispan实例。这种模式非常适合在大型集群中运行应用程序,因为可以通过向集群中添加新的节点实例来线性扩展Infinispan数据网格,每个服务器将其虚拟内存(堆)添加到数据网格中。此外,Infinispan内部使用对等(P2P)通信,消除了对实例集中协调器的需求,避免了集中协调器可能成为企业应用程序单点故障的问题。在P2P架构中,集群节点向相邻节点发送远程过程调用(RPC)消息,类似于本地调用。此模式推荐用于构建需要感知集群的应用程序,或需要内存分布式缓存来应对数据库或其他昂贵数据源的场景。
- **客户端/服务器模式**:当需要向外部提供对网格的访问时,可以使用此模式。该模式描述了Infinispan数据网格与一个或多个节点之间的关系,为一个或多个客户端提供数据。出于安全原因,或者希望为非Java应用程序提供数据时,也可以考虑使用此模式。Infinispan包含特殊模块,可让非Java的外部客户端访问数据网格。所有这些模块都遵循相同的结构,服务器端应用程序创建一个Infinispan实例,负责控制网格中每个节点的对象状态。同时,Infinispan还提供了使用特定协议访问数据网格所需的客户端组件。例如,有REST和Memcached服务器模块,第一个客户端应用程序使用REST HTTP协议,第二个使用任何Memcached客户端来访问数据网格。
以下是这两种模式的对比表格:
| 模式 | 优点 | 适用场景 |
| --- | --- | --- |
| 嵌入式(P2P)模式 | 可线性扩展,消除单点故障 | 大型集群应用,需要感知集群的应用,应对昂贵数据源 |
| 客户端/服务器模式 | 提供外部访问,支持非Java客户端 | 需要外部访问,安全需求,非Java应用数据提供 |
#### 3. 缓存容器与缓存管理
Infinispan提供了`EmbeddedCacheManager`接口,它是获取缓存实例的工厂,通过重载的`getCache()`方法可以获取缓存实例。可以使用`CacheManager`的构造函数来创建它,构造函数可以选择传入符合XML的配置文件路径或`Configuration`对象。`DefaultCacheManager`类实现了`EmbeddedCacheManager`接口和`Lifecycle`接口,负责`CacheManager`类的生命周期,有`start()`和`stop()`两个方法。在创建任何缓存实例之前,必须启动`CacheManager`类,默认构造函数会创建并启动一个新的默认`CacheManager`实例。在应用程序终止之前,应该调用`CacheManager`类的`stop()`方法,以确保对`CacheManager`管理的所有缓存进行适当的清理。
#### 4. 默认缓存与命名缓存
- **默认缓存**:在集群环境中,Infinispan可以配置为为同一`CacheManager`创建的所有缓存提供共享设置。可以通过默认缓存配置定义共享设置,这些设置包括JMX配置、网络、传输和复制设置、驱逐过程、编组和序列化特性等。要检索默认缓存,可以调用`CacheManager`类的`getCache()`方法。对默认缓存配置的更改将应用于网格中的每个实例,除非显式覆盖。创建默认缓存所需的最小XML配置代码如下:
```xml
<infinispan>
</infinispan>
```
- **命名缓存**:命名缓存不需要在配置中声明,如果未定义,由于命名缓存与默认缓存具有相同的XML配置,它们将自动以与默认缓存相同的方式进行配置。要检索命名缓存,可以调用`CacheManager.getCache(String name)`方法,但要注意名称属性指示的缓存必须存在,并且每个命名缓存的值必须唯一。可以通过声明式配置(提供自己的XML文件)或通过配置API以编程方式覆盖默认设置,为特定缓存进行配置。在同一个Infinispan网格中,可以在同一个`CacheManager`下拥有任意数量的不同命名缓存,并且Infinispan允许不同的命名缓存具有相同的键,这为缓存存储提供了多租户的方式,在SaaS应用程序中非常有用。
以下是Infinispan 6.0.*和7.0.*的命名缓存声明式配置示例:
```xml
<!-- Infinispan 6.0.* -->
<namedCache name="CacheClient_Blue">
<clustering mode="invalidation">
<sync replTimeout="20000"/>
</clustering>
</namedCache>
<namedCache name=" CacheClient_Brown">
<clustering mode="replication">
<async asyncMarshalling="true"/>
</clustering>
</namedCache>
<!-- Infinispan 7.0.* -->
<invalidation-cache name="CacheClient_Blue" mode="SYNC"
remote-timeout="20000"/>
<replicated-cache name="CacheClient_Brown" mode="ASYNC"
async-marshalling="true"/>
```
以下是相同配置的编程式示例:
```java
EmbeddedCacheManager manager = new DefaultCacheManager(new
GlobalConfigurationBuilder().transport().defaultTransport().
build());
public Cache<String, String> getInvalidationCacheForClient(String
name){
Configuration config = new ConfigurationBuilder()
.clustering()
.cacheMode(CacheMode.INVALIDATION_SYNC)
.sync().replTimeout(20000)
.build();
manager.defineConfiguration(name, config);
return manager.getCache(name);
}
public Cache<String, String> getReplicationCacheForClient(String name)
{
Configuration config = new ConfigurationBuilder()
.clustering()
.cacheMode(CacheMode.REPL_ASYNC)
.async().asyncMarshalling(true)
.build();
manager.defineConfiguration(name, config);
return manager.getCache(name);
}
```
要检索命名缓存,重复调用默认缓存的步骤,唯一的区别是使用重载的`getCache()`方法并传入缓存名称:
```
```
0
0
复制全文
相关推荐










