Redis

时间:2018-03-05 12:16:19

标签: node.js redis hapijs ioredis

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

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

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

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

我们在这里使用Hapijs,Redis 3.0,ioredis

1 个答案:

答案 0 :(得分: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)
})

这是一个非常宽松的例子,因为我只是快速编写它而没有看到你的代码库,但我希望你能得到这个想法。