redis - 如何在 Redis 中创建双向 HashMap ?

标签 redis hashmap

我有一个集合,其中每个 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/

相关文章:

ruby - 从 redis 列表中删除特定索引处的元素

perl - perl 中的 zrangebyscore redis

hashmap - 如何有效地从 HashMap 中查找和插入?

java - LinkedHashMap 大小不变

windows - Windows 上的 Tomcat 日志传送到 logstash

redis - 无法在redis中执行批量插入

ruby-on-rails - Redis保存一个hash并得到一个hash

java - 为什么 Java 中的 Map<> 设计为需要两种类型; Map<> 和 HashMap<>?

用于唯一对象实例的 Java Map?

java - 为什么 HashSet 的名称中有 "Hash"?