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

时间:2014-09-15 23:16:26

标签: redis hashmap

我有一个集合,其中每个Foo映射到一个Bar,每个Bar映射到一个Foo。我需要能够在给定条形图的情况下查找相应的Foo,并在给定Foo的情况下查找相应的条形图。

为了做到这一点,目前,我已经创建了两个哈希映射,每次进行插入时,我都会执行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中实现双向哈希映射?

1 个答案:

答案 0 :(得分:5)

您可以将数据存储在有序集合而不是散列中,foos是字符串,因此这些将是您的值,而条形是整数,因此这些将是您的分数。

添加新的foo。

ZADD myzset bar foo

使用foo获取吧。

ZSCORE myzset foo

使用栏获取foo

ZRANGEBYSCORE myzset bar bar

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