当同时有多个请求时,Redis 不会更新

2024-01-24

我有一个 Node.js 应用程序,我正在尝试使用 Redis 缓存来记录发出的请求量。这只是一个概念证明,旨在了解 Redis 是否是适合我的工具,但我对结果有点失望,我想知道 Redis 是否只是性能非常糟糕,或者我的代码是否存在缺陷。

我有以下代码:

const express = require('express')
const Redis = require('ioredis')

const client = new Redis(6379, 'redis');

client.on('connect', function() {
    console.log('Redis client connected');
});

client.on('error', function (err) {
    console.log('Something went wrong ' + err);
});

const getRedisCount = async (question_id) => {
    const count = await client.get('votes_' + question_id);

    if(count) {
        return count;
    }

    await setRedisCount(question_id, 0)
    return 0;
}

const setRedisCount = async (question_id, count) => {
    await client.set('votes_' + question_id, count)
}

const app = express();
app.use(express.json());

// post a vote
app.post('/vote', async (req, res) => {
    let count = await getRedisCount(req.body.question_id)
    count++
    await setRedisCount(req.body.question_id, count)

    res.status(200).send({ status: 200, data: count });

})

app.listen(5000, () => {
    console.log('Vote service listening on port 5000')
})

现在,当我在 Postman 中执行单个发布请求时,这一切都按预期工作。计数器按预期更新。

但是,当我在 JMeter 中运行测试时,我一次执行 150 个请求,在最后一个请求之后我得到的计数约为 20-30,而不是预期的 150。

所以我的问题是 - 这是预期的行为,还是我的代码中的错误?在这两种情况下 - 如何解决它?


这可能与您的 redis 服务器配置有关。

您可以从主机上的 redis cli 运行 MONITOR。

通常您通过 cli 连接,例如:

https://redis.io/topics/rediscli https://redis.io/topics/rediscli

redis-cli -h <your server ip> -p <your server port> -a <if you have a server password enabled>

$ redis-cli -h host -p port -a password

默认端口为 6379

这将显示与 redis 服务器的所有交互,但是不要运行它,因为总是运行它会降低性能,但非常适合故障排除。

https://redis.io/commands/monitor https://redis.io/commands/monitor

 $ redis> monitor
 1339518083.107412 [0 127.0.0.1:60866] "keys" "*"
 1339518087.877697 [0 127.0.0.1:60866] "dbsize"
 1339518090.420270 [0 127.0.0.1:60866] "set" "x" "6"
 1339518096.506257 [0 127.0.0.1:60866]

这应该可以告诉您问题所在。

您还可以从 redis cli 运行 INFO 命令来查看服务器统计信息和内存使用情况等信息。

https://redis.io/commands/info https://redis.io/commands/info

redis> INFO
 # Server 
 redis_version 999.999.999
 redis_git_sha1:3c968ff0
 redis_git_dirty:0
 redis_build_id:51089de051945df4
 redis_mode:standalone 
 os:Linux 4.8.0-1-amd64 x86_64 
 arch_bits:64 
 multiplexing_api:epoll
 atomicvar_api:atomic-builtin 
 gcc_version:6.3.0
 process_id:8394
 </snip>

还要在代码中使用 Redis 客户端的 INCRBY 命令,否则需要在设置计数值之前增加计数值,这与异步模式不一致。

https://redis.io/commands/incrby https://redis.io/commands/incrby

我认为你的问题是因为这是异步的,对吧?

因此,计数在发布时不同步,因为有些计数可能会先于其他计数等待。

无论哪种方式,您可能都想尝试将它们同步发布,看看这是否会产生影响,然后您就知道这就是问题所在,并且最好使用 redis INCR 命令来实现此目的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当同时有多个请求时,Redis 不会更新 的相关文章

随机推荐