美文网首页我爱编程
Ignite 封装的 JCache

Ignite 封装的 JCache

作者: SofiyaJ | 来源:发表于2018-04-02 10:37 被阅读0次

    在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()));
    

    相关文章

      网友评论

        本文标题:Ignite 封装的 JCache

        本文链接:https://www.haomeiwen.com/subject/tshicftx.html