基于MongoDb ObjectId的基于Redis光标的分页

时间:2018-11-12 18:21:31

标签: mongodb redis

到目前为止,我还没有使用Redis的经验,但是我正在探索将MongoDB用作数据库并将Redis用作缓存的可能性。

我要处理的问题是Redis是否能够在如上所述的基于光标的分页范围内处理MongoDb ObjectId,例如:https://developer.twitter.com/en/docs/tweets/timelines/guides/working-with-timelines.html
在此示例中,我们有一个maxId,它用作从上一个请求中获取的最大id,并将用作获取下一页的下限。

在MongoDb中,我探索了大于/小于ObjectId上的运算符的用户这不是问题,但是我不知道我是否能够在Redis中处理此问题,因为ObjectId很有可能会被存储作为字符串值。

这个问题对我来说很重要,因为它将帮助我决定是使用MongoDb ObjectId还是使用自动增量作为PK ID。我宁愿使用ObjectId。

注意:我正在用Java编写后端,所以花哨的npm模块不是我想要的。

1 个答案:

答案 0 :(得分:0)

我想出的解决方案:

  • 将时间戳记用作光标
  • 将时间戳记存储为Redis中的分数。即使在这种情况下理论上可能存在重复的分数,对于我的应用程序来说,这也会导致分页冲突的可能性可以忽略不计。
    例如:我在第10个成绩上有重复的分数。下一个请求将在其结果中包括当前时间戳,这意味着在下一个请求中将同时返回第10和第11个结果。
  • 万一Redis返回结果,好的
  • 如果Redis不返回结果,则时间戳游标也可以用于查询MongoDb中的ObjectId。即使ObjectId不支持毫秒,这也不是真正的问题。查找具有限制/偏移量的所有objectId的<=光标时间戳应该可以正常工作。搜索中的光标时间戳需要,因此毫秒级的变化不会造成麻烦。
  • 如果Redis仅返回部分结果,则可以根据Redis中最后可用帖子的ObjectId查询MongoDb。

此解决方案并不理想,因为客户端将需要对上次处理的结果与新接收的结果进行额外的检查,以避免重复渲染,但这并不是一个真正的问题,因为这不是开放的api,只能使用内部。在寻找了相当长的时间之后,似乎没有一种万能的解决方案来解决这种问题。