基于地图名称的 Hazelcast 地图存储
Hazelcast mapstore based on map name
我有一个根据地图名称组织数据的 Hazelcast 实例。地图名称是动态的,所以在 Hazelcast 实例启动之前我不知道它们会是什么。我现在想通过 MapStore 功能将这些数据存储在数据库中,但保留我使用地图名称设置的组织。在查看 MapStore 功能时,我没有看到任何方法来检索对象来自的地图或地图名称。看起来我得到的只是 MapStore 实现中的键值对。
更广泛地说,是否有任何方法可以获取有关需要存储的键值对的任何信息(不仅仅是地图名称)?我想传递一些关于如何存储数据的知识...我在调用 map.put(..) 时知道这些信息,但我不知道如何将该信息传递给 MapStore 调用...
据我了解,hazelcast 中没有开箱即用的支持。以下是我能想到的几个解决方法:
- 将额外信息(地图名称、如何存储数据等)封装在上下文对象中,并将其存储在与您的密钥相对应的不同 java 地图中。稍后在您的 MapStore 实现中使用此地图来检索相应的信息,这将帮助您保留您的键值对。
你把操作可能看起来像。
hzMap.put(key, value);
Context context = new Context();
context.setHowToStoreData();
context.setMapName();
// any othe rother information
context.xxx();
// create a unique context key which can be later deduced from (key,value) pair.
contextKey = getUniqueContextKey(key, value);
contextMap.put(contextKey, context);
在您的 MapStore 实现中,您可以使用此 contextMap 来检索其他值。
- 第二种方式是将信息封装在(键,值)对中。您可以创建一个名为 CacheEntry 的新 class 来存储缓存值和其他信息。然后您可以稍后从 iMap 本身检索您的缓存值以及其他信息。
你把操作可能看起来像。
CacheEntry<YourValueClass> cacheEntry = new CacheEntry<YourValueClass>();
cacheEntry.setValue(value);
cacheEntry.howToStoreData(..);
cacheEntry.setMapName(..);
imap.put(key, cacheEntry);
在您的 MapStore 实现中,您可以利用该值(这将是一个 CacheEntry 对象)本身来检索其他信息以及实际 value
(YourValueClass
的实例)。
我只需要类似的东西,发现您可以实现 com.hazelcast.core.MapStoreFactory 接口,其“newMapStore”方法为您提供从配置映射名称和属性。从那里 'new' 您自己的 MapStore 实现传递地图名称。
public class MyMapStoreFactory implements MapStoreFactory {
@Override
public MapStore newMapStore(String mapName, Properties properties) {
return new MyMapStoreImplementation(mapName, properties);
}
}
并在 hazelcast.xml 配置中配置此工厂 class,如下所示:
<map name="MapX*">
<map-store enabled="true" initial-mode="EAGER">
<factory-class-name>MyMapStoreFactory</factory-class-name>
</map-store>
</map>
请注意地图名称上的通配符,并且在设置 后, 元素不得出现。
使用 Hazelcast 3.6.1 对此进行了测试,效果非常好。
我有一个根据地图名称组织数据的 Hazelcast 实例。地图名称是动态的,所以在 Hazelcast 实例启动之前我不知道它们会是什么。我现在想通过 MapStore 功能将这些数据存储在数据库中,但保留我使用地图名称设置的组织。在查看 MapStore 功能时,我没有看到任何方法来检索对象来自的地图或地图名称。看起来我得到的只是 MapStore 实现中的键值对。
更广泛地说,是否有任何方法可以获取有关需要存储的键值对的任何信息(不仅仅是地图名称)?我想传递一些关于如何存储数据的知识...我在调用 map.put(..) 时知道这些信息,但我不知道如何将该信息传递给 MapStore 调用...
据我了解,hazelcast 中没有开箱即用的支持。以下是我能想到的几个解决方法:
- 将额外信息(地图名称、如何存储数据等)封装在上下文对象中,并将其存储在与您的密钥相对应的不同 java 地图中。稍后在您的 MapStore 实现中使用此地图来检索相应的信息,这将帮助您保留您的键值对。
你把操作可能看起来像。
hzMap.put(key, value);
Context context = new Context();
context.setHowToStoreData();
context.setMapName();
// any othe rother information
context.xxx();
// create a unique context key which can be later deduced from (key,value) pair.
contextKey = getUniqueContextKey(key, value);
contextMap.put(contextKey, context);
在您的 MapStore 实现中,您可以使用此 contextMap 来检索其他值。
- 第二种方式是将信息封装在(键,值)对中。您可以创建一个名为 CacheEntry 的新 class 来存储缓存值和其他信息。然后您可以稍后从 iMap 本身检索您的缓存值以及其他信息。
你把操作可能看起来像。
CacheEntry<YourValueClass> cacheEntry = new CacheEntry<YourValueClass>();
cacheEntry.setValue(value);
cacheEntry.howToStoreData(..);
cacheEntry.setMapName(..);
imap.put(key, cacheEntry);
在您的 MapStore 实现中,您可以利用该值(这将是一个 CacheEntry 对象)本身来检索其他信息以及实际 value
(YourValueClass
的实例)。
我只需要类似的东西,发现您可以实现 com.hazelcast.core.MapStoreFactory 接口,其“newMapStore”方法为您提供从配置映射名称和属性。从那里 'new' 您自己的 MapStore 实现传递地图名称。
public class MyMapStoreFactory implements MapStoreFactory {
@Override
public MapStore newMapStore(String mapName, Properties properties) {
return new MyMapStoreImplementation(mapName, properties);
}
}
并在 hazelcast.xml 配置中配置此工厂 class,如下所示:
<map name="MapX*">
<map-store enabled="true" initial-mode="EAGER">
<factory-class-name>MyMapStoreFactory</factory-class-name>
</map-store>
</map>
请注意地图名称上的通配符,并且在设置
使用 Hazelcast 3.6.1 对此进行了测试,效果非常好。