在aerospike文档中,提到了aerospike有4096个逻辑分区,每个密钥都经过哈希处理,最终映射到1到4096之间的任何分区,这决定了应该存储该密钥的数据的节点。 / p>
但是如果我们有两把钥匙" A"和" AB"我们想将它们存储在同一个节点中,有办法吗?
在Redis中,可以通过将键设置为" A"和" {A} B"这将确保密钥" {A} B"将进入一个节点,其中" A"哈希并存储。
在Apache Ignite中,可以使用" AffinityKey"来完成同样的事情。
Aerospike中是否存在类似的想法?
谢谢
答案 0 :(得分:2)
Aerospike被设计为分布式数据库。 Redis被设计为在单个节点上运行,并且至少本身缺少诸如data distribution,clustering,复制,故障转移等概念。我知道你可以使用各种应用程序端的恶作剧将它变成一个特殊的集群。
不要担心Aerospike数据分发的实施细节。这些在客户端和集群之间自动发生,并且不要求您在应用程序端执行任何操作。相反,请考虑一下您的访问模式。
首先,您的Aerospike集群将确保数据均匀分布。因为工作与数据成正比,所以应确保节点是同构的。然后,您可以期望多节点操作在每个节点上的时间大致相同。
您可以经常在secondary index的字段上创建querying,以提高查询速度。版本3.12添加了predicate filtering,允许您在基于初始二级索引的过滤器之上创建更复杂的查询谓词(另请参阅Java客户端PredExp类)。
如果您不想使用二级索引(有几个正当理由),您可以使用外部记录创建自己的查找。在名为 country-school 的set中,每个国家/地区都可以record(例如' india'卢森堡&#39} ;)值为list,其中包含该国家/地区学校的ID。您可以通过一次获取获取列表(如果它有几个记录,例如india-1,india-2,...,india-9999,则可以获取批次,然后使用结果组成一个batch-get学校的运作。批量读取按照您要求的顺序返回结果,这样您就可以得到一个大批量,检查最后一个元素是否为空,如果没有得到另一个批次。
('ns1', 'country-school', 'us-california') => [ 1, 2, 3, 5, 8, 11, .. ]
同样,您可以使用较小的列表创建排列,例如 country-state-city ,(例如,us-california-oakland)。这会花费一些额外的空间,但可以更快地(key-value)检索,而无需在二级索引上花费内存。
('ns1', 'country-school', 'us-california-oakland') => [ 1, 5, 42, .. ]