首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis扫描没有给出NodeJS中的所有匹配

Redis扫描没有给出NodeJS中的所有匹配
EN

Stack Overflow用户
提问于 2018-10-17 22:00:30
回答 2查看 3.4K关注 0票数 0

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

使用下面的代码,可以有10个匹配,但代码将只返回一些类似于2-3。问题可能是什么,我们如何解决?

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

代码语言:javascript
复制
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。仍有不完全扫描结果
  2. 删除了与模式匹配的所有键,并添加了一些返回键。现在,在进行扫描时,所有内容都返回。经过一个小时的比赛,它又一次返回了不完整的结果。重复此操作将不再适用于解决问题。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-18 06:09:03

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

您可以按以下方式考虑您的代码:

代码语言:javascript
复制
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)
            }
        })
}
票数 3
EN

Stack Overflow用户

发布于 2019-07-06 08:04:12

…或者您使用红-异步,这使您不必自己小心地控制所有这些。(请阅读更多关于它的这里。)

代码语言:javascript
复制
const redis = require('redis')
const client = redis.createClient(…)
const generators = require('redis-async-gen')
const { keysMatching } = generators.using(client)

const results = []
for await (const key of keysMatching('test*')) {
  results.push(key)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52864230

复制
相关文章

相似问题

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