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

标签 java caching key ignite

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

场景如下:我有一个类A,它只有一个java.util.Map字段,我将其用作要映射到的点燃缓存键有一定的值(value)。

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

两个服务都在 ignite 上执行affinityCalls,因此无论使用哪个服务实例,ignite 调用都将转到同一节点。

发生的场景如下: 1. 服务S1N进行关联调用,并在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/

相关文章:

git - 如何使用私钥克隆 GIT 存储库

java - 从 txt 文件中读取数据而不下载它?

java - 为什么不能在Java上播放file.wav全部?

java - 回收者 View 混合了其元素的内容

java - 选择具有复合 id 的对象时的 Hibernate 查询缓存

ruby-on-rails - 列出所有缓存片段的键

java - 使我的所有 ajax 响应不可缓存的简单方法

ruby-on-rails - 在初始化程序中设置 cache_store

php - 在 simpleXMLElement 的 foreach 循环中获取子索引

PHP:从数组中获取 key ?