java - Hazelcast:我可以为每个 JVM 配置一个映射吗?

标签 java hazelcast

Hazelcast 中是否有一些选项可以使每个节点的 map 缓存值,而不是复制他的状态?我认为这是 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) 将其从所有 map 中驱逐

真的不是那么透明,我怀疑 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 方法进行驱逐。

关于java - Hazelcast:我可以为每个 JVM 配置一个映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29380874/

相关文章:

java - 单击“下一步”按钮后复选框未清除

java - 深入探讨 Hazelcast 新手的问题

java - 添加新节点时,hazelcast 内存队列是否会扩展?

hazelcast - 最大限度地减少 Hazelcast 的干扰和开销

spring-boot - 带有 Hazelcast 和 Tomcat 的 Spring Boot

java - Hazelcast JCache CacheEntryListener 触发过于频繁

java - 从文件摘要创建 pkcs7 签名

java - java中使用数组的字典

java - JHipster Java Web 应用程序开发及其热重载功能

java - 如何在 Java 中绘制贝塞尔路径的控制点?