场景:当请求到来时,我需要连接到Redis实例,打开连接,获取计数,更新计数并关闭连接(对于每个请求,这是流程)。当请求按顺序发出时,即1个用户依次发送100个请求,则Redis中的计数为100。
问题:问题是并发请求到来时。即10个用户同时发送100个请求(每个用户10个请求),然后计数不是100,大约是50。
示例:假设Redis中的计数为0.如果同时发出10个请求,则将打开10个连接,所有10个连接将计数值取为0并将其更新为1 。
分析:我发现,由于请求同时发生,多个连接正在获取相同的计数值并更新它,因为计数值被覆盖。如果你已经遇到过这个问题,任何人都可以建议一个避免这个问题的最佳方法。
我们在这里使用Hapijs,Redis 3.0,ioredis
答案 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)
})
这是一个非常宽松的例子,因为我只是快速编写它而没有看到你的代码库,但我希望你能得到这个想法。