基于二级索引的Redis数据结构设计
假设我必须在缓存中存储以下对象-基于二级索引的Redis数据结构设计,redis,redis-cluster,Redis,Redis Cluster,假设我必须在缓存中存储以下对象- { student_id: "student123", school_id: "xyz123", class_id: "class123" } 我如何设计我的Redis数据结构,使我可以通过任何ID检索对象? 我尝试执行HSET命令:HSET student123 school\u id xyz123 class\u id class123,但这会为特定的student\u id创建一个散列。我还想确保搜索处于O(1)中。提前谢谢 为
{
student_id: "student123",
school_id: "xyz123",
class_id: "class123"
}
我如何设计我的Redis数据结构,使我可以通过任何ID检索对象?
我尝试执行HSET
命令:HSET student123 school\u id xyz123 class\u id class123
,但这会为特定的student\u id创建一个散列。我还想确保搜索处于O(1)中。提前谢谢
为了澄清这一点,如果我必须按学校id进行搜索,我将如何进行呢?您需要使用多个关键字索引来获取查询中的O(1) 还可以考虑使用其他数据结构。看看这个,还有另一个 比如说,使用集合将{student123,xyz456,class789}条目添加为:
SADD student:student123 "xyz456 class789"
SADD school:xyz456 "student123 class789"
SADD class:class789 "xyz456 student123"
你可能会想“这会大大增加我的内存使用”。的确如此。这是记忆和处理之间通常的权衡。关系数据库在创建索引时也会这样做。但Redis将提供亚毫秒的性能,Redis使用多种技巧优化内存使用,如所示
数据结构的最佳组合取决于用例的具体情况
考虑删除键中的前缀如果它们是常量,只需在值中放置前缀的顺序上保持一致即可
SADD student:123 "456 789"
请记住,集合和排序集合仅允许唯一成员。如果您为使用学生ID作为分数的学生使用一个排序集:
ZADD students 123“456 789”
,然后将另一名学生与ZADD students 235“456 789”
添加到同一学校班级,这实际上更新了“456 789”
,它没有添加新值。嘿,你能分享你的代码吗?你尝试过的东西或你提到的链接能让你对appliedI提到的解决方案有更清晰的了解吗?你遇到了什么问题?您不能按各自的id检索数据吗?搜索不是O(1)?二者都澄清你的问题。刚刚编辑了我的评论@sazzadHGETALL/HGET/HMGET。