Redis中最快的伪索引是什么?

3

《Redis小书》解释了如何通过电子邮件地址查找用户ID,以便您可以通过用户ID查找用户哈希并获取完整的用户对象。这实际上是一个按电子邮件地址索引用户的方法。您只需要在插入新用户时添加到查找哈希表中,就像这样:

set users:9001 "{id: 9001, email: leto@dune.gov, ...}"
hset users:lookup:email leto@dune.gov 9001

这个操作似乎涉及到 Redis 在寻找所需电子邮件字段的值时必须执行的隐藏查找。可能有数千个电子邮件字段,而我们只需要其中一个。

那么使用索引键中的电子邮件字段如下怎么样:

set users:9001 "{id: 9001, email: leto@dune.gov, ...}"
set users:lookup:email:leto@dune.gov 9001

因为在Redis小书中没有建议这样做,所以我认为这不是最佳实践。

有人能解释一下为什么第一种方法更好吗?它们是不是效果相同?

谢谢,我正在学习Redis。

1个回答

5
据我所见,每种方法都有其自身的优缺点:
哈希方法:
  • 你可以非常快速地(O(N),其中N是映射中条目的数量)获取所有电子邮件(键)或ID(值)的列表。
  • 对于少量条目,它将非常高效(而且很小,可能不适用于任何真正的用例)。
  • 你受到2^32-1个条目的限制(除非你计划大多数人在地球上使用你的应用程序,否则可能不是问题)。
  • 稍微慢一些,因为Redis需要进行两个O(1)查找而不是只有一个...如果有区别,那么很小。
  • 由于它们都在同一个Redis实例中,因此不适合分片。
关键字方法:
  • 没有条目数限制。
  • 速度尽可能快。
  • 只能通过使用KEY来获取所有用户的列表,这是O(n)(对于数据库中的每个条目 - 在实时环境中大量使用是不可取的)。
  • 适合分片。
这些是我能想到的所有差异。我倾向于使用关键字方法,除非出于某种原因需要列出所有用户,因为它更加直观并且与分片扩展更好。
此外,如果可以避免的话,我可能不会将JSON数据存储为用户数据,因为使用哈希存储字段很可能更加节省内存。而且你只需要在某个时刻获取和设置你真正需要的字段,而不是获取整个块。也可以在没有事务的情况下原子地对哈希进行增量操作,这可能很有用。但这完全取决于你的数据...如果你有一个大型嵌套结构,那么最简单的方法可能是将其序列化并抛入其中,而不是创建许多不同的本地结构并将它们链接在一起。

1
这篇博客文章解释了使用多个键比哈希花费更多的内存,但它可能不适用于我问题的有限数据范围: http://blog.gomiso.com/2011/05/24/how-redis-can-ruin-your-day-and-what-you-can-do-to-fix-it/ - Typo Johnson

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