【问题标题】:Redis does not delete key immediatelyRedis 不会立即删除 key
【发布时间】:2020-01-26 09:50:11
【问题描述】:

EDIT :原来是节点导致了这种情况。 for 循环在等待 promise 解决之前以某种方式运行下一次迭代。 Redis 在这里什么都不做。

我有一个程序可以遍历一系列我想与 Redis 中的键进行比较的事物。如果条件已满,我想从数据库中删除密钥。我正在为此使用ioredis。 代码如下:

async function checkthings () {
        for (const thing of list_of_things) {
            await new Promise(function (resolve, reject){
                let stream = redis.scanStream({ match: '5:*'})

                stream.on("data", async function (result){
                    result.length > 0 ? console.log(result) : null;
                    stream.pause();

                    for (const key of result) {
                        let result = await redis.hgetall(key);

                        if ([CONDITIONS PUT HERE])
                             await redis.del(key);

                    }

                    stream.resume();
                })

                stream.on("end", function (){
                    console.log("Done iterating.");
                    resolve();
                })
            });
        }
    }   
}

问题是当我运行这段代码时,在第一次迭代时一切正常。但是在第二次迭代中,应该删除的键被列在了 SCAN 结果中。即使使用 KEYS 仍然会显示它。我不知道这是否是我的 Node.JS 或 Redis 的错误。

抱歉,如果问题难以阅读。这是我的第一个问题。

【问题讨论】:

  • 你是用replica读的吗?
  • 第一次迭代,如“事物列表的第一次迭代”?
  • @tuanAnhTran 是的。
  • 我尝试了您的 sn-p,稍作修改,但结果显示为应有的结果。删除的键不会在下一次迭代中返回:-/
  • @RoganMatrivski 啊,应该是预料之中的。我的测试集太小,看不到重复。请参阅此处的文档redis.io/commands/scan

标签: javascript node.js redis ioredis


【解决方案1】:

来自SCANdocumentation

一个给定的元素可能会被多次返回。由应用程序处理重复元素的情况,例如仅使用返回的元素以执行多次重新应用时安全的操作。

所以这应该是 Redis 的SCAN 预期的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多