我爱编程

Ignite 封装的 JCache

2018-04-02  本文已影响0人  SofiyaJ

在Ignite的架构中,JCache为数据访问提供简单易用且功能强大的API。关于数据的分布和一致性可以在实际开发中有充分的自由度。
基于JCache可以实现:

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()));
上一篇下一篇

猜你喜欢

热点阅读