【问题标题】:Concurrent requests overriding data in Redis并发请求覆盖 ​​Redis 中的数据
【发布时间】:2018-06-15 12:40:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: node.js redis hapijs ioredis


    【解决方案1】:

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

    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)
    })
    

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

    【讨论】:

    • 您好,谢谢您的回复。但是这里的用例是我需要对请求数量应用速率限制。因此,一旦我读取计数,我将检查限制值并决定是处理请求还是拒绝请求。
    • @AnilKumarR 我不知道为什么这会阻止你使用排队系统。我在我的答案中添加了一些示例代码,这可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多