我有一个集合,其中每个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中实现双向哈希映射?
答案 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是返回的元素数量。不确定这是否会节省你的空间,但我认为值得一试。