当HTTP请求的并发性增加时,为什么使用INCR指令递增的计数器不等于请求数?

2024-04-18 23:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Redis服务器进行负载测试。我想在redis中测试INCR操作,我将计数器初始化为1(通过设置一个名为total calls的键),然后对于每个传入的请求,我将计数器增加1。因此在3000个请求之后,计数器应该是3000,在8000个请求之后,计数器必须是8000

为此,我创建了一个运行express的简单NodeJS脚本和一个增加计数器的简单中间件。我用了loadtest 用于负载测试。当没有并发性时,一切都正常工作,但当I增加并发性时,结果会出现135的差异。我不明白为什么会这样

对于并发性为1且请求数为3000的输入测试:

loadtest -n 3000 -c 1 http://localhost:3000

redis get total-calls命令给出3000的预期结果

但是如果我将并发性增加到5,并在从redis中删除前一个键之后运行相同的命令,那么我得到的总计数是3001。为什么会发生这种情况

loadtest -n 3000 -c 5 http://localhost:3000

当请求数进一步增加到8000个时,总数变成了8003个。我不明白这是为什么

被loadtest命中的代码:

const express = require('express');
const app = express();
const Redis = require("./redis-wrapper");

const client = new Redis();
const maxCallsAllowed = 50000

const requestCounter = async (req, resp, next) => {
    // Increment the request counter
    const redis = client.redis;
    if(await redis.exists("total-calls") === 1) {
        // Key already exists
        // Increment the key
        await redis.incr("total-calls")
    }else {
        // Key does not exist
        // Set the key
        await redis.set("total-calls", 1)
    }
    next();
}

app.get('/', requestCounter, (req, resp, next) => {
    resp.json({
        status: 'ok'
    })
});

app.listen(3000);

有什么我不知道的吗?为什么计数大于请求数?我也用locust.io进行了测试,但注意到了相同的行为


Tags: theredisapplocalhosthttp计数器awaitresp