node.js - 当一次有很多请求时,Redis 不会更新

标签 node.js redis

我有一个 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

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

 $ 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

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

我认为您的问题是因为这是异步的,对吗?

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

无论哪种方式,您都可能想尝试同步发布它们以查看这是否有所不同,那么您知道这就是问题所在,最好为此目的使用 redis INCR 命令。

关于node.js - 当一次有很多请求时,Redis 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56493112/

相关文章:

javascript - NodeJS : child_process. exec 未执行函数

python - 使用 redis.StrictRedis() 在 redis 中插入一个新数据库

nosql - 如何删除redis中列表中的所有值?

javascript - mqtt 异步等待消息然后响应 http post 请求

javascript - 从 &lt;script&gt; &lt;/script&gt; 访问 <% %> 中定义的变量

node.js - 如何在React中查看axios错误响应JSON

node.js - 如何判断我的客户端是否运行安全连接 (SSL)

git - merge redis 的 repos 以在 Openshift 上工作

database - 如何在D盘安装redis服务器?

php - 具有多个客户端并防止缓存踩踏的 PHP Web 服务的最佳方法