0

场景:当请求到来时,我需要连接到 Redis 实例,打开连接,获取计数,更新计数并关闭连接(对于每个请求,这就是流程)。当请求按顺序出现时,即 1用户一个接一个地发送 100 个请求,然后 Redis 中的计数为 100。

问题:问题是并发请求何时到来。即 10 个用户同时发送 100 个请求(每个用户 10 个请求),那么计数不是 100,而是大约 50。

示例:假设 Redis 中的 count 为 0。如果同时有 10 个请求,则将打开 10 个连接,所有 10 个连接将获取 count 值为 0 并将其更新为 1。

分析:我发现,随着请求同时到来,多个连接正在获取相同的计数值并更新它,因为计数值被覆盖。如果您已经遇到此问题,任何人都可以建议避免此问题的最佳方法。

这里我们使用 Hapijs、Redis 3.0、ioredis

4

1 回答 1

0

我建议对每个任务进行排队,以便每个请求在下一个请求开始之前完成。

Queue.js是我以前用过的一个很好的库,但如果你愿意,可以查看其他库。

这是一个基本上来自文档的示例,但略微适合您的用例:

var queue = require('../')

var q = queue()
var results = []

var rateLimited = false

q.push(function (cb) {
    if(!rateLimited){
        // get data and push into results
        results.push('two')
    }
  cb()
})

q.start(function (err) {
  if (err) throw err
  console.log('all done:', results)
})

这是一个非常松散的示例,因为我只是快速编写它并且没有看到您的代码库,但我希望您能理解。

于 2018-03-05T12:42:35.717 回答