javascript - Redis SCAN 没有给出 NodeJS 中的所有匹配项

标签 javascript node.js redis node-redis

我正在使用带有 redis npm 包的 Node.JS 脚本来检索与模式 animals:toFeed:* 匹配的所有 Redis 键。匹配的一个示例是键 animals:toFeed:17ed160f59c5b31caf7e741a4e62cb7785414cd

使用下面的代码,可以有 10 个匹配项,但代码只会返回 2-3 个这样的匹配项。可能是什么问题,我们该如何解决?

使用 Redis 4.0.11、Node.js 8.11.3、redis 2.8.0 npm 包

async function scanAsync(cursor, pattern, results) {
    return redis.scanAsync(cursor, 'MATCH', pattern, 'COUNT', '10')
        .then(function(reply) {
            cursor = reply[0]
            if(cursor === '0') {
                console.log('Scan complete')
            } else {
                console.log('Match #', i)
                let keys = reply[1]
                keys.forEach(function(key, i) {
                    results.push(key)
                })
                return scanAsync(cursor, pattern, results)
            }
        })
}

let keys = []
let prefix = 'animals:toFeed:*'
await scanAsync('0', prefix, keys) 

更新

  1. 重启了redis。仍有不完整的 SCAN 结果
  2. 删除了所有与模式匹配的键并添加了一些键。现在,在执行 SCAN 时,所有内容都会返回。播放一个小时后,它再次开始返回不完整的结果。重复此操作不再能解决问题。

最佳答案

当光标等于 '0' 时,您忘记将键添加到 results 中,但您应该始终添加这些键。

您可以考虑如下代码:

async function scanAsync(cursor, pattern, results) {
    return redis.scanAsync(cursor, 'MATCH', pattern, 'COUNT', '10')
        .then(function(reply) {

            let keys = reply[1]
            keys.forEach(function(key) {
                results.push(key)
            })

            cursor = reply[0]
            if(cursor === '0') {
                console.log('Scan complete')
            } else {
                return scanAsync(cursor, pattern, results)
            }
        })
}

关于javascript - Redis SCAN 没有给出 NodeJS 中的所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52864230/

相关文章:

javascript - 禁用/隐藏第一张/最后一张幻灯片上的幻灯片箭头

javascript - ngx-bootstrap for angular - datepicker 如何在似乎没有任何效果时更改主题颜色

node.js - 使用带有 Sequelize 的原始批量更新查询

javascript - Mongo 返回未定义但数据存在

javascript - 如何使用 deferrable 执行一系列 Redis 操作?

javascript - 在开发人员控制台打开之前元素不可见

javascript - 将 d3 事件从 Javascript 转换为 Typescript (Angular2)

python - 从用 Node.js 编写的 AWS Lambda 函数调用 Python boto3 库

php - 输出缓存和Redis?

Node.js/Redis - 等待连接?