Apache Ignite缓存基本操作实例详解

2025-07-23 20:50

本文主要是介绍Apache Ignite缓存基本操作实例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免...

这段内容主要讲解了 Apache Ignite 中缓存(IgniteCache)的基本操作,包括获取缓存、创建缓存、销毁缓存、执行原子操作以及异步操作等。下面我将用中文对这些内容进行详细解释,帮助你更好地理解。

一、获取缓存实例(Getting an Instance of a Cache)

所有对缓存的操作都必须通过 IgniteCache 实例来完成。你可以获取一个已经存在的缓存,或者动态创建一个新缓存。

示例代码:

Ignite ignite = Ignition.ignite();
// 获取名为 "myCache" 的缓存实例
IgniteCache<Integer, String> caChina编程che = ignite.cache("myCache");

⚠️ 注意:不同缓存的泛型类型可能不同,比如 IgniteCache<Integer, String>IgniteCache<String, Person> 是不同的类型。

二、动态创建缓存(Creating Caches Dynamically)

你也可以在运行时动态创建一个缓存,使用 getOrCreateCache() 方法。如果缓存已经存在,就直接返回;如果不存在,就根据配置创建。

示例代码:

CacheConfiguration<Integer, String> cfg = new CacheConfiguration<>();
cfg.setName("myNewCache");
cfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
IgniteCache<Integer, String> cache = ignite.getOrCreateCache(cfg);

配置说明:

  • setName(...):设置缓存名称。
  • setAtomicityMode(...):设置缓存的原子性模式(例如 TRANSACTIONALATOMIC)。
  • 还可以设置很多其他参数,比如备份数量、缓存模式(分区/复制)等。

注意事项:

  • 如果在集群拓扑发生变化(如节点加入或退出)时调用 getOrCreateCache(),可能会抛出异常:
Javax.cache.CacheException: class org.apache.ignite.IgniteCheckedException: Failed to start/stop cache, cluster state change is in progress.
  • 遇到这个异常时,建议稍后重试。

三、销毁缓存(Destroying Caches)

使用 destroy() 方法可以从整个集群中删除一个缓存。

示例代码:

Ignite ignite = Ignition.ignite();
IgniteCache<Long, String> cache = ignite.cache("myCache");
cache.destroy();  // 删除名为 "myCache" 的缓存

⚠️ 注意:此操作是不可逆的,会删除所有节点上的缓存数据和配置。

四、基本原子操作(Basic Atomic Operations)

获取到缓存后,可以进行常见的 putgetremove 等操作。

示例代码:

IgniteCache<Integer, String> cache = ignite.cache("myCache");
// 存入数据
for (int i = 0; i < 10; i++) {
    cache.put(i, Integer.toString(i));
}
// 获取数据
for (int i = 0; i < 10; i++) {
    System.out.println("Got [key=" + i + ", val=" + cache.get(i) + ']');
}

批量操作注意事项:

  • 使用 putAll()removeAll() 等批量操作时,是作为一系列原子操作执行的。
  • 如果部分操作失败,会抛出 CachePartialUpdateException,并包含失败的 key 列表。
  • 如果希望批量操作作为一个整体完成,建议使用 事务

五、条件更新操作(Conditional UpdaChina编程tes)

Ignite 提供了一些带有条件判断的更新方法,用于实现线程安全的更新逻辑。

示例代码:

// 如果 key 不存在,则插入,返回旧值
String oldVal = cache.getAndPutIfAbsent(11编程China编程, "Hello");
// 如果 key 不存在,插入,返回是否成功
boolean success = cache.putIfAbsent(22, "World");
// 如果 key 存在,替换,返回旧值
oldVal = cache.getAndReplace(11, "New value");
// 如果 key 存在,替换,返回是否成功
success = cache.replace(22, "Other new value");
// 如果值匹配,才替换
success = cache.replace(22, "Other new value", "Yet-another-new-value");
// 如果值匹配,才删除
success = cache.remove(11, "Hello");

六、异步操作(Asynchronous Execution)

Ignite 的很多缓存操作都有对应的 异步版本,方法名通常带有 Async 后缀。

示例代码:

// 同步 get
V get(K key);
// 异步 get
IgniteFuture<V> getAsync(K key);

异步操作的处理方式:

  • 返回一个 IgniteFuture 对象,表示异步操作的结果。
  • 可以阻塞等待结果,也可以注册监听器来非阻塞地处理结果。

示例监听器:

IgniteCompute compute = ignite.compute();
IgniteFuture<String> fut = compute.callAsync(() -> "Hello World");
fut.listen(f -> System.out.println("Job result: " + f.get()));

七、线程池与闭包执行(Closures Execution and Thread Pools)

  • 如果异步操作在注册监听器前就已经完成,监听器会由当前线程 同步执行
  • 如果异步操作还未完成,监听器会在操作完成后由线程池中的线程 异步执行
    • 缓存操作的异步回调通常由 系统线程池 执行。
    • 计算任务的异步回调通常由 公共线程池 执行。

注意事项:

  • 不要在监听器中再调用同步的缓存或计算操作,这可能导致 线程池饥饿(pool starvation)死锁
  • 如需嵌套异步操作,可以使用 自定义线程池 来避免资源争用。

总结表格

操作类型描述
获取缓存通过 ignite.cache("name") 获取缓存实例
创建缓存使用 getOrCreateCache(cfg) 动态创建缓存
销毁缓存调用 cache.destroy() 删除缓存
原子操作put, get, remove 等基本操作
条件更新putIfAbsent, replace, remove 等带条件操作
异步操作使用 xxxAsync() 方法和 IgniteFuture
线程池监听器可能由系统或公共线程池执行,避免同步调用

如果你是刚开始学习 Ignite,android理解这些基本缓存操作非常重要。它们是构建分布式缓存应用的基础。对于更复杂的场景,如事务、查询、索引等,请参考 Ignite 的高级功能文档。

到此这篇关于Apache Ignite缓存基本操作的文章就介绍到这了,更多相关Apache Ignite缓存内容请搜索China编程(www.chinasem.cn)以前的文章php或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Apache Ignite缓存基本操作实例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155458

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat