繁体   English   中英

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

[英]Redis cursor-based pagination based on MongoDb ObjectId

到目前为止,我还没有使用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模块不是我想要的。

我想出的解决方案:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM