Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于二级索引的Redis数据结构设计_Redis_Redis Cluster - Fatal编程技术网

基于二级索引的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。