【问题标题】:Redis design data structure based on secondary indicesRedis设计基于二级索引的数据结构
【发布时间】:2019-12-24 00:26:09
【问题描述】:

假设我必须将以下对象存储在我的缓存中-

{
    student_id: "student123",
    school_id: "xyz123",
    class_id: "class123"
} 

如何设计我的 Redis 数据结构,以便我可以通过任何 id 检索对象? 我尝试执行HSET 命令:HSET student123 school_id xyz123 class_id class123 但这会为特定的 student_id 创建一个哈希。我还想确保搜索在 O(1) 中。提前致谢!

澄清一下,如果我必须按 school_id 搜索,我该怎么做?

【问题讨论】:

  • 嘿,您能否分享代码以及您尝试过的内容或您引用的链接,以便更清楚地了解您已应用的解决方案
  • 我指的是-redis.io/commands/hset
  • 您遇到了什么问题?您不能通过各自的 id 检索数据?搜索不是 O(1)?两个都?澄清你的问题。
  • 刚刚编辑了我的评论@sazzad
  • HGETALL/HGET/HMGET.

标签: redis redis-cluster


【解决方案1】:

您需要使用多个键索引才能在查询中获得 O(1)。

也可以考虑使用其他数据结构。看看Secondary indexing with Redishow to have relations many to many in redis 和其他article on many to many

假设,使用 sets,您将 {student123, xyz456, class789} 条目添加为:

SADD student:student123 "xyz456 class789"
SADD school:xyz456 "student123 class789"
SADD class:class789 "xyz456 student123"

您可能会认为“这会大大增加我的内存使用量”。确实如此。这是内存和处理之间通常的权衡。关系数据库在创建索引时也会这样做。但是 Redis 会给你亚毫秒级的性能,而且 Redis 使用了多种技巧来优化内存使用,比如ziplists,参见https://redis.io/topics/memory-optimization

哪种数据结构组合最好取决于您的用例的具体情况。

如果键中的前缀是不变的,请考虑删除它们,只要在值中放置它们的顺序保持一致即可。

SADD student:123 "456 789"

请记住,集合和排序集合只允许唯一成员。如果您使用学生 ID 作为分数的学生使用一个排序集:ZADD students 123 "456 789",然后使用ZADD students 235 "456 789" 在同一学校添加另一个学生,这实际上更新了"456 789" 的分数,它没有添加新的价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多