首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据添加到REDIS散列中的有效方法

将数据添加到REDIS散列中的有效方法
EN

Stack Overflow用户
提问于 2020-05-08 23:49:29
回答 2查看 2.5K关注 0票数 2

在将结果发送到数据库之前,我正在进行一些计算,将其存储在REDIS数据库中。

目前,我在单独的GAE实例(使用NodeJS处理的单线程计算)中对每块10k项进行批处理操作,虽然计算速度确实很好,但执行HSET操作的推送操作需要很长时间,因此会导致不同线程中的一些延迟(因为REDIS是单线程-使用Google基本实例的fyi )。

我做错了什么?我怎样才能让它比现在更快地被推进(比如成批的或者其他的)?

代码语言:javascript
复制
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逐个推送每个项目,想知道我们是否可以在单个HSET事务中执行某种SQL transactions并推动10k项,而不是每次都追加REDIS。

每个块(10k项)在保存到REDIS后的大小为43 in (因此总共100 k项提供430 in)。对于某些架构设计,必须将其存储在单个REDIS散列中。

当前速度(毫秒),每个作业在并行的单独线程中运行:

代码语言:javascript
复制
"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"

如有任何反馈,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-09 16:57:15

我使用HSET和HMSET测试了10000多个值,并创建了简单的批量函数来处理记录,从简单的数据角度看,它看起来非常棒,让我们看看它将如何在生产环境中结束。

虽然npm redis库不喜欢hset以这种方式使用它,但hmset确实使用了这一点,这很奇怪。

代码语言:javascript
复制
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]);
}

批量追加

票数 1
EN

Stack Overflow用户

发布于 2020-05-09 02:43:44

您要做的是用一个键/值多次调用hset。这是不好的,因为往返延迟。

对10k键/值执行此操作将是10k往返行程。

您可以使用具有多个键/值的hset,因此它将是一次到redis的旅程。例如

hset field1 value1 field2 value2 field3 value3

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61689936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档