我有一个集合,其中每个 Foo 映射到一个 Bar,每个 Bar 映射到一个 Foo。我需要能够在给定 Bar 的情况下查找相应的 Foo,并在给定 Foo 的情况下查找相应的 Bar。
为了做到这一点,目前,我创建了两个 hashmap,每次插入时,我执行 2 个 HSET
,每个 hashmap 一个:
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 中实现双向 HashMap ?
最佳答案
您可以将数据存储在有序集中而不是散列中,foos 是字符串,因此它们将是您的值,而 bars 是整数,因此它们将是您的分数。
添加一个新的 foo。
ZADD myzset bar foo
使用 foo 获取 bar。
ZSCORE myzset foo
使用 bar 获取 foo
ZRANGEBYSCORE myzset bar bar
请记住 hgets 是 O(1)。 zscore 也是 O(1),但 zrangebyscore 是 O(log(N)+M),其中 N 是排序集中的成员数,M 是返回的元素数。不确定这是否会为您节省空间,但我认为值得一试。
关于redis - 如何在 Redis 中创建双向 HashMap ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858310/