node.js—将数据附加到redis哈希的有效方法

4uqofj5v  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(393)

我正在做一些计算,在将结果发送到数据库之前,我将结果存储在redis数据库中。
目前,我在单独的gae示例(使用nodejs的单线程计算)中处理每个块大小为10k的批处理操作,而计算速度非常好,执行的push操作 HSET 操作需要很长时间,因此会在不同的线程中造成一些延迟(因为redis是单线程的-仅供参考,我使用的是googleredis基本示例)。
我做错什么了?我怎样才能使它比现在推得更快(比如成批或其他)?

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"

任何反馈都将不胜感激。

ztmd8pv5

ztmd8pv51#

我用hset和hmset测试了10000多个值,我创建了简单的批量函数来处理记录,从简单的数据Angular 来看,它看起来很棒,让我们看看它将如何在生产环境中结束。
npm redis 图书馆不喜欢hset这样说 hmset 你做的很奇怪。

const myarr = [];
const values = 10000;
for(let i = 0; i < values; i++) {
    myarr.push(`key${i}`);
    myarr.push('value');
}
await this.bulkRedisHash('myTest', myarr);
/*
    [Nest] 17800   - 2020-05-09 18:45:30   [FinalizeTaskService] starting +5ms
    [Nest] 17800   - 2020-05-09 18:45:30   [FinalizeTaskService] finished +21ms
 */
for (let i = 0; i < myarr.length; i++) {
    if (i % 2 !== 0) {
        await this.appendRedisHash('myTest2', myarr[i-1], myarr[i]);
    }
}
/*
   [Nest] 18396   - 2020-05-09 18:49:08   [FinalizeTaskService] starting +4ms
   [Nest] 18396   - 2020-05-09 18:49:09   [FinalizeTaskService] finished +795ms

* /

public async appendRedisHash(key: string, field: string, value: any) {
    const appendRedisHashAsync = promisify(this.redisClient.hset).bind(this.redisClient);
    return appendRedisHashAsync(key, field, value);
}

public async bulkRedisHash(key: string, keyValue: string[]) {
    const appendRedisHashAsync = promisify(this.redisClient.hmset).bind(this.redisClient);
    return appendRedisHashAsync(key, [...keyValue]);
}

批量追加

j91ykkif

j91ykkif2#

您所做的是用一个键/值多次调用hset。这是不好的,因为往返延迟。
按10k键/值操作将是10k往返。
你可以用 hset 具有多个键/值,因此只需一次就可以访问redis。如 hset field1 value1 field2 value2 field3 value3

相关问题