在Ignite中使用Map作为缓存键的错误

时间:2017-02-10 14:03:06

标签: java caching key ignite

所以我最近在使用Ignite时遇到了一个错误,这让我疯狂地想到了,并认为这篇文章可能会帮助一些失去灵魂的人,所以这里有:

方案如下:我有一个 A 类只有一个 java.util.Map 字段,我将其用作要映射到的点火缓存键一些价值。

我有2个相同服务的实例: S1 & S2 ,每个都运行一个点燃节点。 让我们将实例的点燃节点称为节点 N M

两个服务都在点燃时执行affinityCalls,因此无论使用什么服务实例,点燃调用都将转到同一个节点。

发生的情况如下: 1.服务 S1 N 进行亲和力调用,并在 N 的缓存中存储 A 的映射 - >值 V 2.服务 S2 执行相同的亲和性调用并转到 N ,但是,当尝试检索放在 N 中的值时在第1步缓存,它无法检索它,就好像缓存不包含它一样。

为了使事情更清楚,请考虑以下伪代码:

S1 第1步中执行以下操作。

IgniteCache igniteCache = ....;

Map map1 = new Map(); map1.put(“some key”,“some value”);

A cacheKey = new A (地图);

igniteCache.put(keyInCache,any);

S2 第2步

中执行以下操作

IgniteCache igniteCache = ....;

Map map2 = new Map(); map2.put(“some key”,“some value”);

A keyToRetrieve = new A (map2);

igniteCache.contains(keyToRetrive) - >假的。

即使keyToRetrieve.equals(cacheKey)为真。

并且缓存确实包含cacheKey。

我发现问题的罪魁祸首是使用地图作为 A 类型键中的字段。 因为看起来似乎点燃了处理具有Map成员的键的问题,如下所述:

Ignite cache.containsKey returns false although keys are equal

2 个答案:

答案 0 :(得分:3)

使用Map作为缓存密钥非常不典型,我不建议这样做。如果键是具有多个字段的复合对象,并且没有类,则可以使用二进制构建器构建它:https://apacheignite.readme.io/docs/binary-marshaller#modifying-binary-objects-using-binaryobjectbuilder

答案 1 :(得分:0)

答案是:

使用Map以外的其他内容作为键。我使用了一个整数然后所有问题都消失了。

我怀疑它可能与如何检查地图在Ignite中的幕后等等有关。