【发布时间】:2020-08-24 15:31:21
【问题描述】:
我正在做一些计算,将结果存储在 REDIS 数据库中,然后再发送到数据库。
目前我在单独的 GAE 实例(使用 NodeJS 的单线程计算)中处理每个块大小为 10k 个项目的批量操作,虽然计算速度非常好,但执行 HSET 操作的 PUSH 操作需要很长时间时间,所以它会导致不同线程中的一些延迟(因为 REDIS 是单线程的 - fyi 我使用的是 Google REDIS Basic 实例)。
我做错了什么?我怎样才能让它比现在更快地推送(比如批量或一些)?
const key = '123';
for (const [column, value] of results) {
await this.appendRedisHashValue(key, column, value);
}
public async appendRedisHash(key: string, field: string, value: any) {
const appendRedisHashAsync = promisify(this.redisClient.hset).bind(this.redisClient);
return appendRedisHashAsync(key, field, JSON.stringify(value));
}
如您所见,我只是使用HSET 逐个推送每个项目,想知道我们是否可以做某种SQL transactions 并在单个 HSET 事务中推送例如 10k 个项目而不是附加 REDIS 哈希每一次。
每个块(10k 项)在保存到 REDIS 后的大小约为 43MB(因此总共 100k 项提供 430MB)。对于某些架构设计它必须存储在一个单一的 REDIS 哈希中。
当前速度(毫秒),每个作业都在并行单独的线程中运行:
"push": 13608
"finishedAt": "2020-05-08T22:51:26.045Z"
push": 13591,
"finishedAt": "2020-05-08T22:51:29.640Z"
"push": 15738,
"finishedAt": "2020-05-08T22:51:59.177Z"
"push": 21208,
"finishedAt": "2020-05-08T22:51:44.432Z"
"push": 13332,
"finishedAt": "2020-05-08T22:51:28.303Z"
"push": 10598,
"finishedAt": "2020-05-08T22:51:44.455Z"
"push": 27249,
"finishedAt": "2020-05-08T22:51:58.458Z"
"push": 36270,
"finishedAt": "2020-05-08T22:52:00.708Z"
"push": 25106,
"finishedAt": "2020-05-08T22:52:02.234Z"
"push": 12845,
"finishedAt": "2020-05-08T22:52:02.254Z"
我们将不胜感激。
【问题讨论】:
-
mset不符合要求,因为这是用于简单的键/值存储而不是用于哈希,不确定管道,你有一些例子吗? -
你看过 Redis 流水线吗:redis.io/topics/pipelining?通过减少每个命令的 RTT(往返时间),它有助于在一个连接中向 Redis 发送一系列命令,而不是在那里连续发送单个命令。
标签: node.js typescript google-app-engine redis