代码之家  ›  专栏  ›  技术社区  ›  Nyxynyx

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

  •  0
  • Nyxynyx  · 技术社区  · 7 年前

    redis npm包来检索与模式匹配的所有Redis键 animals:toFeed:* . 一个匹配的例子就是关键 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。仍然有不完整的扫描结果
    1 回复  |  直到 7 年前
        1
  •  3
  •   sazzad    7 年前

    你忘了把钥匙加进去 results 当光标等于 '0'

    您可以考虑以下代码:

    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)
                }
            })
    }
    
        2
  •  1
  •   Wilfred Springer    6 年前

    redis-async-gen here

    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)
    }