我正在使用带有 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)
更新
- 重启了redis。仍有不完整的 SCAN 结果
- 删除了所有与模式匹配的键并添加了一些键。现在,在执行 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/