假设我必须将以下对象存储在我的缓存中-
{
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搜索,我将如何处理?
答案 0 :(得分:0)
您需要使用多个键索引才能在查询中获得O(1)。
还考虑使用其他数据结构。看看Secondary indexing with Redis,how 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"
的分数,没有添加新值。