Near Cache
这段内容讲的是 Apache Ignite 中的 Near Cache(近缓存),以及它在 客户端节点(client nodes) 和 服务端节点(server nodes) 上的使用方式和优势。我们可以从以下几个方面来理解:
一、什么是 Near Cache(近缓存)?
定义:
- Near Cache 是一种 本地缓存(local cache),它存储在请求数据的节点上;
- 用于缓存最近或最频繁访问的数据;
- 通常用于 客户端节点,因为客户端节点本身不存储数据,每次查询都需要从服务端节点获取数据。
举例:
- 假设你有一个客户端节点频繁查询“国家代码”;
- 每次都从远程节点获取数据会带来网络延迟;
- 使用 Near Cache 后,这些数据会被缓存在客户端本地,下次访问就直接从本地读取。
二、Near Cache 的特点
特性 | 描述 |
---|---|
本地缓存 | 数据存储在发起请求的节点上(客户端或服务端) |
仅缓存特定缓存的数据 | 每个 Near Cache 只对应一个底层缓存 |
基于堆内缓存(on-heap) | 数据以 Java 对象形式存储在堆内存中 |
可配置最大容量和逐出策略 | 支持 LRU、FIFO 等 eviction policies |
事务一致性 | 当服务端数据变化时,Near Cache 会自动更新或失效 |
继承主缓存配置 | 如 expiry policy 等配置会继承自主缓存 |
三、如何配置 Near Cache?
你可以通过 XML 配置 或 编程方式动态创建 Near Cache。
1. XML 配置方式(静态配置)
<bean class="org.apache.ignite.configuration.CacheConfiguration"><property name="name" value="myCache"/><property name="nearConfiguration"><bean class="org.apache.ignite.configuration.NearCacheConfiguration"><!-- 使用 LRU 逐出策略,最大缓存 100,000 条 --><property name="nearEvictionPolicyFactory"><bean class="org.apache.ignite.cache.eviction.lru.LruEvictionPolicyFactory"><property name="maxSize" value="100000"/></bean></property></bean></property>
</bean>
2. Java 代码动态创建(推荐用于客户端节点)
// 创建 Near Cache 配置
NearCacheConfiguration<Integer, String> nearCfg = new NearCacheConfiguration<>();// 设置 LRU 逐出策略,最大缓存 100,000 条
nearCfg.setNearEvictionPolicyFactory(new LruEvictionPolicyFactory<>(100_000));// 获取或创建 Near Cache(对应底层缓存 "myCache")
IgniteCache<Integer, String> cache = ignite.getOrCreateNearCache("myCache", nearCfg);// 从 Near Cache 获取数据
String value = cache.get(1);
四、Near Cache 的生命周期
-
Near Cache 是 按需创建 的:
- 当某个节点第一次请求某个缓存的数据时,如果该缓存配置了 Near Cache,就会自动创建;
- 如果是客户端节点,且没有配置 Near Cache,也可以通过
getOrCreateNearCache()
动态创建。
-
Near Cache 是 本地的:
- 它只存在于创建它的节点上;
- 不会复制到其他节点;
- 节点重启后 Near Cache 数据会丢失(除非你手动持久化)。
五、Near Cache 的配置参数(不继承主缓存)
参数 | 描述 | 默认值 |
---|---|---|
nearEvictionPolicy | Near Cache 的逐出策略(如 LRU、FIFO) | 无(不启用逐出) |
nearStartSize | Near Cache 的初始容量(条目数) | 375,000 |
这些参数必须在
NearCacheConfiguration
中单独配置,不会从主缓存继承。
六、Near Cache 的适用场景
场景 | 是否适合使用 Near Cache |
---|---|
客户端节点频繁读取缓存数据 | ✅ 非常适合,减少网络延迟 |
缓存数据经常变化 | ✅ Near Cache 支持自动更新/失效 |
缓存数据量大但访问热点集中 | ✅ 可缓存热点数据,减少远程访问 |
服务端节点需要缓存数据 | ✅ 可以使用,但更推荐使用堆内缓存(on-heap cache) |
数据必须强一致性 | ⚠️ Near Cache 有最终一致性,不适合强一致性场景 |
七、Near Cache 与堆内缓存的区别
对比项 | Near Cache | On-Heap Cache(堆内缓存) |
---|---|---|
存储位置 | 客户端或服务端本地 | 服务端堆内存 |
数据来源 | 远程缓存的副本 | 主缓存的本地副本 |
自动更新 | ✅ 支持 | ✅ 支持 |
一致性 | 最终一致性 | 最终一致性 |
用途 | 客户端加速 | 服务端加速 |
逐出策略 | 可配置 | 可配置 |
是否共享 | 否(每个节点独立) | 是(服务端共享) |
八、总结
- Near Cache 是客户端节点提升缓存访问性能的重要机制;
- 它缓存的是远程缓存的“热点”数据;
- 支持逐出策略、自动更新、事务一致性;
- 可以静态配置(XML)或动态创建(Java API);
- 适合用于频繁读取、低延迟、弱一致性要求的场景;
- 不适合用于强一致性或大规模写入的场景。
如果你还有关于 Ignite 的缓存机制、事务一致性、缓存组(cache groups)、内存模型、性能调优等方面的问题,也欢迎继续提问!