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

标签 database-design indexing redis

The Little Book of 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。

最佳答案

在我看来,每种方法都有自己的优点和缺点:

散列法:

  • 您可以相当快地获得所有电子邮件(键)或 ID(值)的列表(O(N),其中 N 是映射中的条目数)
  • 对于少量条目,内存效率会很高(虽然很小,可能不适用于任何实际用例)
  • 您的条目限制为 2^32-1(同样,这可能不是问题,除非您计划让地球上的大多数人使用您的应用程序)
  • 稍微 慢一些,因为 Redis 需要执行两次 O(1) 查找,而不是一次...边际差异,如果明显的话。
  • 对分片不友好,因为它们都在同一个 redis 实例中。

关键方法:

  • 参赛作品数量不限
  • 尽可能快
  • 只有使用 KEY 才能获得所有用户的列表,这是 O(n)(对于数据库中的每个条目 - 对于实时环境来说是一个很大的禁忌)
  • 分片友好

这些是我能想到的所有差异。我倾向于倾向于 key 方法,除非我出于某种原因需要列出所有用户,只是因为它更直接并且可以通过分片更好地扩展。

顺便说一句,如果可以避免,我可能不会将 JSON 数据存储为用户数据,因为将字段存储在哈希中可能会更节省内存。此外,您可以只获取并设置您真正需要某个点的字段,而不是整个 blob。也可以在没有事务的情况下以原子方式在散列中进行增量,这很有用。但这完全取决于您的数据...如果您有一个大型嵌套结构,最简单的方法可能是将其序列化并将其放入其中,而不是创建许多不同的 native 结构并将它们链接在一起。

关于database-design - Redis中最快的伪索引是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15396974/

相关文章:

php - 使用关系数据库来存储面对面游戏的结果

android - 如何在 Android 中创建本地数据库?

elasticsearch - 从ElasticSearch中的文本中提取数字

nosql - 如何在 Redis 中查询和表示对象/哈希之间的关系

php - 产品具有属性(变体)数据库设计?

sql-server - 表设计 - 宽表与作为属性的列

python - 如何在Python中将数组中的值替换为列表中的值?

javascript - 如何解释 float 组索引?

java - SpringSession DefaultCookieSerializer.setJvmRoute 有效,但 HttpServletRequest 没有所需的 jvmRoute

redis - 在 Gitlab CI 中使用 redis