Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Node.js 使用Redis存储索引索引的最佳方法?_Node.js_Database_Indexing_Redis - Fatal编程技术网

Node.js 使用Redis存储索引索引的最佳方法?

Node.js 使用Redis存储索引索引的最佳方法?,node.js,database,indexing,redis,Node.js,Database,Indexing,Redis,是的,这个问题令人困惑。如果你知道一个更好的方式来问我的问题,请分享 我正在使用NodeJS和Redis设计一个不可知的restapi。服务器设置为索引模型规范中设置为索引的任何字段 例: 现在,添加用户时,索引的字段是“角色”字段。数据库将如下所示: // user objects stored as regular key key: "users:<ID1>" | value: "{ ...userData }" // "rol

是的,这个问题令人困惑。如果你知道一个更好的方式来问我的问题,请分享

我正在使用NodeJS和Redis设计一个不可知的restapi。服务器设置为索引模型规范中设置为索引的任何字段

例:

现在,添加用户时,索引的字段是“角色”字段。数据库将如下所示:

// user objects stored as regular key
key: "users:<ID1>" | value: "{ ...userData }"

// "role" indexes stored as hash key
hash key: "users:role" | field: "worker" | value: "users:<ID1>"
//存储为常规密钥的用户对象
键:“用户:|值:{…用户数据}”
//“角色”索引存储为哈希键
散列键:“用户:角色”|字段:“工作者”|值:“用户:”
当添加的第二个用户在“角色”字段中也具有值“worker”时,数据库就是这样的:

// user objects stored as regular key
key: "users:<ID1>" | value: "{ ...userData1 }"
key: "users:<ID2>" | value: "{ ...userData2 }"

// "role" indexes stored as hash key (previous value gets replaced)
hash key: "users:role" | field: "worker" | value: "users:role:worker"

// "worker" value for "role" gets created as list
key: "users:role:worker" | value: [ "users:<ID1>", "users:<ID2>" ]
//存储为常规密钥的用户对象
键:“用户:|值:{……userData1}”
键:“用户:|值:{……userData2}”
//存储为散列键的“角色”索引(替换以前的值)
散列键:“用户:角色”|字段:“工作者”|值:“用户:角色:工作者”
//将“角色”的“工作者”值创建为列表
键:“用户:角色:工作人员”|值:[“用户:”,“用户:”]
这样,除非为了节省空间而需要,否则不会创建辅助索引。二级索引是一个保存用户对象键的列表。初始索引值作为其值保存此列表的键,在本例中为“users:role:worker”

这很好地工作,除非同时使用空数据库创建多个用户。这种索引设计不是无状态的,因此它会导致奇怪的事情发生

我的问题是,如何改进这种设计?我想到了几种解决方案,但它们都有一些缺点

可能的解决方案#1 从头开始创建二级索引(带有键“users:role:worker”的列表)。然而,考虑到它会为每个有索引的字段创建两个条目,这似乎是浪费空间,而索引通常是不必要的

可能的解决方案#2 存储ID的字符串数组,而不是将ID存储为每个索引的值。这将阻止创建该辅助列表。新的用户ID将被添加到字符串数组中。但是,此方法意味着每当添加新用户时,字符串数组将被覆盖。这让我相信,同时请求只会相互覆盖,导致不必要的结果


你觉得怎么样?有更好的设计来处理这个问题吗

非常感谢您的帮助和反馈

我最终完成了解决方案1,效果很好。我没有为这个特定字段将模式规范设置为
index:true
,而是设置了一个
deepIndex:true
,它从一开始就自动创建二级索引

这意味着任何可能在多个实例之间具有共享值的字段都将以这种方式“深度索引”。

我最终完成了解决方案1,效果很好。我没有为这个特定字段将模式规范设置为
index:true
,而是设置了一个
deepIndex:true
,它从一开始就自动创建二级索引


这意味着任何可能在几个实例之间共享值的字段将以这种方式被“深深地索引”。它有一个确切的“标签”行为,请看:RedisCloud会很好,但我使用Redis Enterprise Cloud来轻松管理集群或节点,并且它没有与RedisSearch集成(从2019年春季开始)。如果你是Redis Cloud Pro用户,你应该将其内置在良好的呼叫中,但我目前只使用essentials版本。Pro有点贵。一旦产品发布并盈利,我可能会升级。ReDeSeCurk是一个野兽,它提供了许多其他令人敬畏的功能。现在基本支持所有ReISIS实验室模块,包括重新考虑使用ReDeDeCH。它有一个确切的“标签”行为,请看:RedisCloud会很好,但我使用Redis Enterprise Cloud来轻松管理集群或节点,并且它没有与RedisSearch集成(从2019年春季开始)。如果你是Redis Cloud Pro用户,你应该将其内置在良好的呼叫中,但我目前只使用essentials版本。Pro有点贵。一旦产品发布并盈利,我可能会升级。RediSearch是一个beast,它还提供了许多其他很棒的功能。essentials现在支持所有RedisLabs模块,包括RediSearch

// user objects stored as regular key
key: "users:<ID1>" | value: "{ ...userData1 }"
key: "users:<ID2>" | value: "{ ...userData2 }"

// "role" indexes stored as hash key (previous value gets replaced)
hash key: "users:role" | field: "worker" | value: "users:role:worker"

// "worker" value for "role" gets created as list
key: "users:role:worker" | value: [ "users:<ID1>", "users:<ID2>" ]