java - Apache Ignite Eviction 在 2.x 中被破坏,但在 1.9 中工作正常

标签 java 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。但如果我将 ignite 版本更改为 1.9,一切都会按预期工作。

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

最佳答案

自 2.0 版本起,Ignite 使用堆外内存。它按页分配内存,当可用空间耗尽时,它们可能会被驱逐。您可以在这里找到此机制的描述:https://apacheignite.readme.io/docs/evictions#section-off-heap-memory

因此,当 90% 的内存被占用时,您可以告诉 Ignite 开始从某个特定数据区域逐出页面。

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

关于java - Apache Ignite Eviction 在 2.x 中被破坏,但在 1.9 中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48314340/

相关文章:

java - 将 Apache Ignite BinaryObject 与 SQL 表混合

java - 缺少强制输入时使用的最佳运行时异常是什么

java - 相当于充气城堡中的 pgp 命令

Java 如何从 ActionListener 类继承变量

java - 是否应该允许 GET 请求触发异常?

zend-framework - 使用Varnish/ESI和Zend框架的缓存和页面 View

android - 位图文本与 native 缓存的比较

javascript - 文件缓存 : Query string vs Last-Modified?

java - Apache 点燃查询

mysql - 当持久存储中的数据可用且 csv 可用时,如何更新 ignite 缓存?