Apache Ignite Eviction在2.x中被破坏,但在1.9中运行良好

时间:2018-01-18 05:21:44

标签: apache caching ignite

我尝试使用Ignite 2.0和2.3来验证简单的缓存驱逐。但是观察到它被打破了,但如果我恢复到1.9,它可以正常工作。

这是我在2.x

中的代码
    CacheConfiguration cc = new CacheConfiguration();

    cc.setName("mycache");
    cc.setCacheMode(CacheMode.PARTITIONED);
    cc.setOnheapCacheEnabled(true);
    cc.setEvictionPolicy(new LruEvictionPolicy(5));

    IgniteConfiguration cfg = new IgniteConfiguration();
    cfg.setCacheConfiguration(cc);

    Ignite ignite = Ignition.start(cfg);

    IgniteCache<String,String> cache = ignite.getOrCreateCache(cc);

    for(int  i=0;i<10;i++){
        cache.put("k"+i,"val-"+i);
    }

    Thread.sleep(1000);

    for(int  i=0;i<10;i++) {
        System.out.println(cache.get("k"+i));
    }

    System.out.println("============================== " + cache.metrics().getSize());

输出打印所有10个缓存条目,但它应该只使用值从缓存键key5到k10打印。因为我的LRU最大尺寸= 5。但是,如果我将点燃verison改为1.9,那么事情会按预期运行。

这是一个已知问题吗?或者我做错了什么。

1 个答案:

答案 0 :(得分:2)

从版本2.0开始,Ignite使用堆外内存。它按页面分配内存,当可用空间结束时,它们可能被逐出。您可以在此处找到此机制的说明:https://apacheignite.readme.io/docs/evictions#section-off-heap-memory

所以,你可以告诉Ignite开始从某个特定数据区域驱逐页面,比如90%的内存被占用。

您启用了另一种驱逐策略,即从Java堆驱逐。它不会影响存储在堆外空间中的数据。堆空间不是替代方案,它只是堆外存储器上的附加数据层。以下是有关Java堆驱逐策略的文档:https://apacheignite.readme.io/docs/evictions#section-java-heap-cache