所以我最近在使用 Ignite 时遇到了一个错误,这让我疯狂地思考,并认为这篇文章可能会帮助一些迷失的灵魂,所以这里是:
场景如下:我有一个类A,它只有一个java.util.Map字段,我将其用作要映射到的点燃缓存键有一定的值(value)。
我有同一服务的 2 个实例: S1 和 S2 ,每个实例都运行一个 ignite 节点。 我们将实例的点燃节点称为节点 N 和 M
两个服务都在 ignite 上执行affinityCalls,因此无论使用哪个服务实例,ignite 调用都将转到同一节点。
发生的场景如下: 1. 服务S1对N进行关联调用,并在N的缓存中存储A的映射 -> 值V 2. 服务S2执行相同的关联调用并转到N,但是,当尝试检索放入N的值时如果按步骤 1 缓存,则无法检索它,就好像缓存不包含它一样。
为了让事情更清楚,请考虑以下伪代码:
S1 在第 1 步中执行以下操作。
IgniteCache igniteCache=....;
map map1= new Map(); map1.put("某个键","某个值");
A cacheKey= new A( map );
igniteCache.put(keyInCache, 任何内容);
S2 在第 2 步中执行以下操作
IgniteCache igniteCache=....;
map map2= new Map(); map2.put("某个键", "某个值");
A keyToRetrieve= new A(map2);
igniteCache.contains(keyToRetrive) --> false。
即使 keyToRetrieve.equals(cacheKey) 为 true。
并且缓存确实包含cacheKey。
我发现这个问题的罪魁祸首是使用Map作为A类型键中的字段。 因为 ignite 似乎在处理具有 Map 成员的键时遇到了麻烦,正如这里提到的:
Ignite cache.containsKey returns false although keys are equal
最佳答案
使用 Map
作为缓存键非常不典型,我不建议这样做。如果键是具有多个字段的复合对象,并且没有类,则可以使用二进制构建器构建它:https://apacheignite.readme.io/docs/binary-marshaller#modifying-binary-objects-using-binaryobjectbuilder
关于java - 在 Ignite 中使用 Map 作为缓存键的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161278/