node.js - 使用 Redis 存储索引索引的最佳方式?

标签 node.js database indexing redis

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

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

例如:

// user object
{ 
  firstName: 'Peter',
  lastName: 'Boyd',
  role: 'worker'
}

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

// 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>"

当添加第二个用户时,“role”字段也具有值“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>" ]

这样,除非为了节省空间而需要,否则不会创建二级索引。二级索引是一个列表,其中包含用户对象的键。初始索引值保存此列表的键,因为它的值在本例中为“users:role:worker”。

除非同时使用空数据库创建多个用户,否则这种方法运行良好。这种索引设计不是无状态的,因此会导致奇怪的事情发生。

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

可能的解决方案#1

从头开始创建二级索引(键为“users:role:worker”的列表)。然而,这似乎是一种空间浪费,因为它会为每个具有索引的字段创建两个条目,而这通常是不必要的。

可能的解决方案#2

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


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

非常感谢您的帮助和反馈!

最佳答案

我最终采用了一种扭曲的解决方案 #1,并且效果很好。我没有为这个特定字段将架构规范设置为 index: true,而是设置了一个 deepIndex: true,它会自动从头创建二级索引。

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

关于node.js - 使用 Redis 存储索引索引的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56141528/

相关文章:

sql - 从子查询中选择行,SQL,解决

java - Dart future 值请求不兼容

node.js - 在 Ubuntu Server 20.04LTS 上全局安装 PM2 出错

node.js - 如何定义 Node.js 状态码而不立即退出?

node.js - 在 azure devops 中在管道作业级别拥有 .env 文件的最佳方法是什么

javascript - 在nodejs中强制在一段时间后关闭连接

java - 你能在没有设置数据库的情况下运行 hibernate 吗?

php - 尝试连接到数据库时出现奇怪的错误

Javascript - 创建数组索引和访问

python - 在numpy中重复具有不同重复值的索引