Ignite 封装的 JCache
2018-04-02 本文已影响0人
SofiyaJ
在Ignite的架构中,JCache为数据访问提供简单易用且功能强大的API。关于数据的分布和一致性可以在实际开发中有充分的自由度。
基于JCache可以实现:
- 基本缓存操作
- ConcurrentMap API
- EntryProcessor:并行处理
- 事件和度量
- 可插拔的持久化
IgniteCache
IgniteCache接口是Ignite缓存实现的一个入口,提供了基于JCache规范的基本方法,包括获取数据、执行查询;此外,还有JCache规范之外的功能,比如数据加载、查询、异步模型。
获取IgniteCache的实例:
Ignite ignite = Ignition.ignite();
IgniteCache<Integer,String> cache = ignite.cache("helloCache");
动态缓存
Ignite中动态缓存的概念和之前有所差异:
传统意义的动态缓存概念如下:
- 动态缓存,计算机术语,用于临时文件交换,缓存是指临时文件交换区,电脑把最常用的文件从存储器里提出来临时放在缓存里,就像把工具和材料搬上工作台一样,这样会比用时现去仓库取更方便。
- 千万不能把缓存理解成一个东西,它是一种处理方式的统称。电脑里最大的缓存就是CPU,而动态缓存就是临时缓存的文件为ASP、ASPX、PHP、JSP等动态网站的文件。
在Ignite中,动态缓存是说可以动态创建一个缓存的实例,这时,Ignite会在所有的符合条件的集群成员中创建和部署该缓存。一个动态缓存启动后,它会在自动部署到新加入的符合条件的节点上。
Ignite ignite = Ignition.ignite();
CacheConfiguration cfg = new CacheConfiguration();
cfg.setName("myCache");
cfg.setAtomicityMode(TRANSACTIONAL);
IgniteCache<Integer,String> cache = ignite.getOrCreateCache("myCache");
XML配置
在任意的缓存节点上定义的基于Spring的XML配置的所有缓存同时会自动地在所有的集群节点上创建和部署(不需要在每个集群节点上指定同样的配置)。
Put&Get
try(Ignite ignite = Ignition.start("example-cache.xml")){
//ignite.getOrCreateCache("myCache")
IgniteCache<Integer,String> cache =
ignite.createCache("myCache");
for (int i = 0; i <10 ; i++) {
cache.put(i,Integer.toString(i));
System.out.println("insert data is " + Integer.toString(i));
}
for (int i = 0; i <10 ; i++) {
System.out.println("get data is " + cache.get(i));
}
//原子操作
// Put-if-absent which returns previous value.
String oldVal = cache.getAndPutIfAbsent(1,"11");
System.out.println(oldVal);
// Put-if-absent which returns boolean success flag.
boolean success = cache.putIfAbsent(2, "22");
System.out.println(success);
// Replace-if-exists operation (opposite of getAndPutIfAbsent), returns previous value.
oldVal = cache.getAndReplace(1 ,"11");
System.out.println(oldVal);
// Replace-if-exists operation (opposite of putIfAbsent), returns boolean success flag.
success = cache.replace(2,"22");
System.out.println(success);
// Replace-if-matches operation.
success = cache.replace(1, "1", "22");
// Remove-if-matches operation.
success = cache.remove(1, "1");
}
所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
EntryProcessor
当在缓存中执行puts和updates操作时,通常需要在网络中发送完整的状态数据,而EntryProcessor可以直接在主节点上处理数据,只需要传输增量数据而不是全量数据。
异步支持
和Ignite中的所有API一样,IgniteCache实现了IgniteAsynchronousSupport接口,因此可以以异步的方式使用。
// Enable asynchronous mode.
IgniteCache<String, Integer> asyncCache = ignite.cache("mycache").withAsync();
// Asynhronously store value in cache.
asyncCache.getAndPut("1", 1);
// Get future for the above invocation.
IgniteFuture<Integer> fut = asyncCache.future();
// Asynchronously listen for the operation to complete.
fut.listenAsync(f -> System.out.println("Previous cache value: " + f.get()));