Hazelcast和MultiMap类型使用“驱逐政策”

时间:2015-04-27 18:36:24

标签: hazelcast

我想保留一个Long类型的List,这取决于其他实体,这个List是用用户ID设置的,很短的时间之后,我想删除那个列表,但是可能有很多条目带有这样的列表。< / p>

因此,我的第一次尝试一直在使用像这样的MultiMap类型&lt; Long,Longs列表&gt;,但遗憾的是,MultiMap尚未实施驱逐政策。下一步是尝试实现一个分布式计划任务来删除所有这些列表,为了实现这一点,我发现了一些在ExecutionService中实现它的方法。

http://docs.hazelcast.org/docs/3.4/javadoc/com/hazelcast/spi/ExecutionService.html

但我不知道要做的好方法,或者即使有可能。

最后,我尝试使用IMap实现这种行为,但是这个aproximation有一个问题,每次我想删除或添加一个新的Long id到列表,我必须从服务器获取完整列表,并确定这不是最好的方法。

2 个答案:

答案 0 :(得分:2)

我需要一种类似于你想要的方法。这是我使用的解决方案:

  1. 使用Hazelcast IMap和MultiMap。 MultiMap将包含“Set”的值,使用与IMap相同的Key值;
  2. 为您的IMap定义一个EntryExpiredListener。这样,当您的IMap条目到期时,相关的MultiMap条目也将被删除,这意味着最终MultiMap将使用为IMap定义的相同驱逐配置,例如:

    static class MyEntryExpiredListener implements EntryExpiredListener {
    @Override
    public void entryExpired(EntryEvent event) {
    // Here you'll remove the entry with the same key in the MultiMap:
    getMultiMap().remove(event.getKey());
    }
    }
    

    ...

    MyEntryExpiredListener entryExpiredListener = new MyEntryExpiredListener();
    

    ...

    HazelcastMap.addEntryListener(entryExpiredListener, false);
    
  3. 您还可以将MultiMap定义为Set,由配置属性(http://docs.hazelcast.org/docs/3.8.3/manual/html-single/index.html#multimap)定义:

    <multimap name="MY_MULTIMAP">
        <value-collection-type>SET</value-collection-type>
     </multimap>
    

答案 1 :(得分:0)

如何将IMap和IList混合以实现目标呢?

IMap<String, String> mapping = hazelcastInstance.getMap("mappings");
String reference = mapping.get("someListIdentifier");
IList<Long> longs = hazelcastInstance.getList(reference);