如何在Redis中创建双向哈希映射?

7
我有一个集合,其中每个Foo都映射到一个Bar,每个Bar都映射到一个Foo。我需要能够查找给定Bar对应的Foo,并查找给定Foo对应的Bar。
为了做到这一点,目前,我创建了两个哈希表,在每次插入时,我执行2个HSET,一个在每个哈希表上:
HSET fooToBar foo1 bar1
HSET barToFoo bar1 foo1

此后,在任何方向上进行查找都变得非常容易:

//Look up bar given a foo
HGET fooToBar foo1
//Look up foo given a bar
HGET barToFoo bar1

然而,我对这个解决方案并不完全满意。在我使用它的应用程序中,空间限制比速度限制更重要,因此我希望只有一个数据结构,而不是两个,即使这意味着查找更昂贵(在合理范围内)。
在Redis中实现双向哈希映射是否有更好的方法?

你的对象有多大? - Anthony Palmer
@AnthonyPalmer 每个 Foos 都不是很大,但它们的数量非常多(数百万)。Foos 是长度约为 40-150 个字符的字符串。Bars 实际上是整数,有 6-8 位数字,但为了在 Redis 哈希映射中使用而在整数和字符串之间进行转换。 - bguiz
1个回答

9
你可以将数据存储在一个排序集合中,而不是哈希表中,其中foos是字符串,因此这些将是你的值,bars是整数,因此这些将是你的分数。
添加新的foo。
ZADD myzset bar foo

使用foo来获取bar。
ZSCORE myzset foo

使用 bar 获取 foo

ZRANGEBYSCORE myzset bar bar

请记住,hget的时间复杂度是O(1)。zscore的时间复杂度也是O(1),但zrangebyscore的时间复杂度是O(log(N)+M),其中N是有序集合中成员数量,M是返回的元素数量。我不确定这是否能节省空间,但我认为值得一试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接