在redis缓存中填充平面数据的最佳方法

pobjuy32  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(442)

我要存储1000万个彼此不相关的扁平字符串密钥对值。

key1: one,
key2: two,
key3: three,
...

我使用lambda函数(最大内存大小为3008mb,超时时间为15分钟)运行populate函数来存储这些密钥对值。
在设置之前,需要先生成密钥对。

const createKeyPair = (num) => {
  // some methods
}

for (let i = 0; i < 10000000; i+=1) {
  const {key, value} = createKeyPair(i)
  redis.set(key, value, (err)=>{
    if (err) redis.quit(() => {
      error = err;
    }
  })
}
redis.quit(()=>{
  // some operation
})

然而,这种方法占用了大量的内存和很长的时间。我看到hset有更好的性能,但是当数据是平面的时候它有关系吗?
我还尝试了使用 ioredis 并按如下方式更换上述代码:

const pipeline = redis.pipeline();
for (let i = 0; i < 1000000; i+=1) {
  const {key, value} = createKeyPair(i);
  pipeline.set(key, value);
}
pipeline.exec((err, res) => {
  if (err) error = err;
  else if (res) response = res;
  redis.quit();
}

但速度还是一样。

iq0todco

iq0todco1#

我的问题是我不能预生成密钥对值,它们必须在插入缓存之前生成。因此,瓶颈。
我的解决方案是创建几个集群,使得每个lambda只运行可管理的数量。换句话说,创建许多具有主从关系的lambda函数。
主设备将发送每个从设备的数量目标。

相关问题