Hazelcast分布式地图:默认驱逐策略是什么?

时间:2019-03-28 08:03:52

标签: caching hazelcast

我在Hazelcast中有一张分布式地图,像这样:

ClientConfig clientConfig = new ClientConfig();
clientConfig.getGroupConfig().setName("clusterName").setPassword("clusterPWD");
clientConfig.getNetworkConfig().addAddress("X.X.X.X");
clientConfig.setInstanceName(InstanceName);
HazelcastInstance instance =  HazelcastClient.newHazelcastClient(clientConfig);
[...]
map = instance.getMap("MAP_NAME");
[...]
// a lot of map.put();
[...]
// a lot of map.get();

我需要避免OOM问题,并每次都要清理缓存。

编辑:默认策略似乎不是EVICTION,因此有必要使用某些策略清除缓存。 我尝试使用这种配置在类路径中添加hazelcast-client.xml

<near-cache name="wm_info">
        <max-size>3</max-size>
        <time-to-live-seconds>5</time-to-live-seconds>
        <max-idle-seconds>5</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <invalidate-on-change>true</invalidate-on-change>
        <in-memory-format>OBJECT</in-memory-format>
</near-cache>

同时添加此代码

EvictionConfig evictionConfig = new EvictionConfig()
.setEvictionPolicy(EvictionPolicy.LRU)
.setSize(2);

NearCacheConfig nearCacheConfig = new NearCacheConfig()
.setName(WM_MAP_NAME)
.setInMemoryFormat(InMemoryFormat.BINARY)
.setInvalidateOnChange(true)
.setTimeToLiveSeconds(5)
.setEvictionConfig(evictionConfig);

clientConfig.addNearCacheConfig(nearCacheConfig);

但不起作用...即使在几分钟后仍将项目缓存在缓存中。

EDIT2:它似乎唯一起作用的方法是:

map.put(code,json,5,TimeUnit.SECONDS);

还有其他选择吗?

谢谢 安德里亚

2 个答案:

答案 0 :(得分:0)

默认情况下未为地图配置驱逐/到期,如果您不希望地图超过阈值,则必须明确配置。如果您继续使用默认配置将条目放入地图中,最终将获得OOM。

下面是一个地图配置,该地图配置允许使用策略最近使用的逐出。当地图大小达到配置的阈值时,某些条目将被逐出。

如果您也想使条目到期,则可以配置生存时间最大空闲时间

  <map name="default">
    ...
    <time-to-live-seconds>0</time-to-live-seconds>
    <max-idle-seconds>0</max-idle-seconds>
    <eviction-policy>LRU</eviction-policy>
    <max-size policy="PER_NODE">5000</max-size>
    ...
  </map>
</hazelcast>

看看文档的“地图撤离”部分 https://docs.hazelcast.org/docs/3.11.2/manual/html-single/index.html#map-eviction

答案 1 :(得分:0)

要添加到Ali的评论中,您必须在集群映射方面添加某种大小限制(条目数,内存大小等)。然后添加驱逐策略,以告知Hazelcast当达到阈值并需要添加新值时要驱逐哪些条目。