Hazelcast:我可以为每个 JVM 配置一个映射吗?
Hazelcast: Can I configure a Map per JVM?
Hazelcast 中是否有一些选项可以使每个节点的地图缓存值不复制他的状态?我认为这是 getMap()
和 getDistributedMap()
之间的区别,但似乎两者都在节点之间复制。
我在Weblogic集群中有一个应用程序,我的配置是:
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast>
<properties>
<property name="hazelcast.logging.type">slf4j</property>
</properties>
<network>
<port auto-increment="true">5107</port>
<join>
<multicast enabled="false" />
<tcp-ip enabled="true">
<members>127.0.0.1:5701, 127.0.0.2:5702</members>
</tcp-ip>
</join>
</network>
<map name="default">
<time-to-live-seconds>1800</time-to-live-seconds>
<backup-count>0</backup-count>
<eviction-policy>LRU</eviction-policy>
</map>
</hazelcast>
在日志中我可以看到两个节点都已启动
Members [2] {
Member [127.0.0.1]:5107
Member [127.0.0.1]:5108 this
}
当我在第一个节点中调用我的方法时,我可以看到添加了缓存
.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5107}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - adding object in the cache with key 2342425
但是在第二个节点中我只看到缓存名称日志,所以它使用的是已经添加的缓存...
.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5108}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}
我是不是遗漏了一些配置?可以用 Hazelcast 实现吗?
正如我在评论中提到的一个用例,其中:
put(key, value)
仅在本地添加元组
evict(key)
从所有地图中驱逐它
并不是真的那么透明,我怀疑 Hazelcast(或任何流行的内存网格)开箱即用地支持它,但您可以做的是使用 Hazelcast 实现一个非常简单的 pub-sub
。在每个 hazelcast 节点上启动一个主题侦听器:
ITopic<String> eviction = hazelcast.getTopic("evict");
eviction.addMessageListener(new EvictionListener());
其中 EvictionListener
类似于:
public class EvictionListener implements MessageListener<String> {
@Override
public void onMessage(Message<String> message) {
// Gets the local (per JVM) cache and evicts an entry from it
Cache.getCache().evict(message.getMessageObject());
}
}
然后您可以将驱逐方法实现为:
public void evict(String key) {
hazelcast.getTopic("evict").publish(key);
}
像这样。然后你需要为每个 JVM 创建一个缓存(正如我提到的一个简单的 Java Map 或一个 Guava 缓存)并使用 evict 方法进行驱逐。
Hazelcast 中是否有一些选项可以使每个节点的地图缓存值不复制他的状态?我认为这是 getMap()
和 getDistributedMap()
之间的区别,但似乎两者都在节点之间复制。
我在Weblogic集群中有一个应用程序,我的配置是:
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast>
<properties>
<property name="hazelcast.logging.type">slf4j</property>
</properties>
<network>
<port auto-increment="true">5107</port>
<join>
<multicast enabled="false" />
<tcp-ip enabled="true">
<members>127.0.0.1:5701, 127.0.0.2:5702</members>
</tcp-ip>
</join>
</network>
<map name="default">
<time-to-live-seconds>1800</time-to-live-seconds>
<backup-count>0</backup-count>
<eviction-policy>LRU</eviction-policy>
</map>
</hazelcast>
在日志中我可以看到两个节点都已启动
Members [2] {
Member [127.0.0.1]:5107
Member [127.0.0.1]:5108 this
}
当我在第一个节点中调用我的方法时,我可以看到添加了缓存
.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5107}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - adding object in the cache with key 2342425
但是在第二个节点中我只看到缓存名称日志,所以它使用的是已经添加的缓存...
.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5108}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}
我是不是遗漏了一些配置?可以用 Hazelcast 实现吗?
正如我在评论中提到的一个用例,其中:
put(key, value)
仅在本地添加元组evict(key)
从所有地图中驱逐它
并不是真的那么透明,我怀疑 Hazelcast(或任何流行的内存网格)开箱即用地支持它,但您可以做的是使用 Hazelcast 实现一个非常简单的 pub-sub
。在每个 hazelcast 节点上启动一个主题侦听器:
ITopic<String> eviction = hazelcast.getTopic("evict");
eviction.addMessageListener(new EvictionListener());
其中 EvictionListener
类似于:
public class EvictionListener implements MessageListener<String> {
@Override
public void onMessage(Message<String> message) {
// Gets the local (per JVM) cache and evicts an entry from it
Cache.getCache().evict(message.getMessageObject());
}
}
然后您可以将驱逐方法实现为:
public void evict(String key) {
hazelcast.getTopic("evict").publish(key);
}
像这样。然后你需要为每个 JVM 创建一个缓存(正如我提到的一个简单的 Java Map 或一个 Guava 缓存)并使用 evict 方法进行驱逐。