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



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

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

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

请考虑同时使用其他数据结构。看看 Redis 的二级索引,如何在 redis 中建立多对多的关系,以及这篇关于多对多的另一篇文章。

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

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

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

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

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

SADD student:123 "456 789"

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

最新更新