分布式缓存的简单操作
本节使用的pom.xml文件和第(1)节中的保持不变。
本节主要介绍分布式缓存的简单使用,缓存的配置以及事务处理,分布式锁和sql查询功能在后面的章节中介绍。
ignite节点的模式
ignite的节点分为server模式和client模式, server节点用来缓存数据,提供任务运算和流数据处理。client节点用来连接集群,使用ignite的数据和计算api。 如果不配置节点默认作为Server模式启动。
可以使用xml模式和java模式来配置节点。
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
...
<!-- client 模式 -->
<property name="clientMode" value="true"/>
...
</bean>
IgniteConfiguration cfg = new IgniteConfiguration();
// client 模式
cfg.setClientMode(true);
// 启动ignite
Ignite ignite = Ignition.start(cfg);
或者使用下面的java配置启动client模式
Ignition.setClientMode(true);
// 这里的start() 也可以指定xml或者java形式的配置
Ignite ignite = Ignition.start();
分布式缓存
缓存可以配置为复制模式(每个server节点上都复制一份数据)和分片模式(数据按照key分片存储到多个server节点上),这里先不介绍,采用默认的配置建立或获取分布式缓存。
先启动若干个server节点,用于存储数据和运行任务。启动后不要关闭。
public static void main(String[] args){
// 使用默认的配置 启动节点
Ignition.start();
}
分布式缓存的基本结构
获取一个key为Integer类型,value为String类型的缓存系统。先存入数据然后获取数据。
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
public class SimpleCache {
public static void main(String[] args){
// 以client的模式启动ignite, 数据存储到前面已经启动的ignite节点上
Ignition.setClientMode(true);
try(Ignite ignite = Ignition.start()){
// 如果缓存不存在创建 如果已存在就获取缓存
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("simple");
for(int i = ; i < ; i++){
cache.put(i, i+"haha");
}
for(int i=; i< ; i++){
System.out.println(cache.get(i));
}
}
}
}
运行该程序在ignite集群中创建名称为simple的分布式缓存。第二次启动时,名称为simple的缓存已经存在获取该缓存,把put语句注释掉仍然可以获取到值。
异步操作
上面的缓存系统中的存储和获取是同步操作,下面介绍下异步操作。
IgniteCache<Integer, String> simple =
ignite.getOrCreateCache("simple");
// 启动异步操作
IgniteCache<Integer, String> asynCache = simple.withAsync();
// 原子操作 获取旧值 存入新值
asynCache.getAndPut(, "3332");
// 获取上面调用的future
IgniteFuture<Integer> fut = asynCache.future();
// 监听结果
fut.listen(f -> System.out.println("Previous cache value: " + f.get()));
原子操作
IgniteCache<Integer, String> simple =
ignite.getOrCreateCache("simple");
// 插入或更新 返回旧值
String oldVal = simple.getAndPut(, "haha");
// 如果不存在则插入 返回旧值
oldVal = simple.getAndPutIfAbsent(, "11 getAndPutIfAbsent2");
// 如果存在则替换 返回旧值
oldVal = simple.getAndReplace(, "11 getAndReplace");
// 删除键值对 返回旧值
oldVal = simple.getAndRemove();
// 如果不存在则插入 成功返回true
boolean success = simple.putIfAbsent(, "12 putIfAbsent");
// 如果存在则替换 成功返回 true
success = simple.replace(, "12 replace");
// 如果值匹配 则替换 成功返回true
success = simple.replace(, "12 replace", "12 12 12");
// 如果值匹配则删除 成功返回true
success = simple.remove(, "11");