首页 文章

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

提问于
浏览
0

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

方案如下:我有一个 A 类,它只有一个 java.util.Map 字段,我用它作为一个点亮缓存键来映射到某个值 .

我有2个相同服务的实例: S1S2 ,每个都运行一个点燃节点 . 让我们将实例的点燃节点称为节点 NM

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

发生的情况如下:1 . 服务 S1N 进行亲和性调用,并在 N 的缓存中存储 A - >值 V 的映射.2 . 服务 S2 执行相同的亲和性调用并转到 N ,但是,当试图检索放在 N _1071122中的值包含它 .

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

S1Step 1 中执行以下操作 .

IgniteCache igniteCache = ....;

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

A cacheKey = new A (map);

igniteCache.put(keyInCache,nothing);

S2Step 2 中执行以下操作

IgniteCache igniteCache = ....;

map map2 = new Map(); map2.put(“一些关键”,“一些 Value ”);

A keyToRetrieve = new A (map2);

igniteCache.contains(keyToRetrive) - > false .

即使keyToRetrieve.equals(cacheKey)为true .

并且缓存确实包含cacheKey .

我发现它的问题的罪魁祸首是使用 Map 作为 A 类型键中的字段 . 因为看起来有点麻烦处理具有Map成员的键有问题,如下所述:

Ignite cache.containsKey returns false although keys are equal

2 回答

  • 0

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

  • 3

    答案是:

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

    我怀疑它可能与如何检查 Map 在Ignite中的幕后操作相关 .

相关问题