基于二级索引的Redis设计数据结构

时间:2019-12-23 05:47:53

标签: redis redis-cluster

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

{
    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搜索,我将如何处理?

1 个答案:

答案 0 :(得分:0)

您需要使用多个键索引才能在查询中获得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"

请记住,集和排序集仅允许唯一成员。如果您为学生编号为ZADD students 123 "456 789"的学生使用一个排序集,然后使用ZADD students 235 "456 789"添加同一学校班级的另一名学生,这实际上更新了"456 789"的分数,没有添加新值。