gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:08:59 37 4
gpt4 key购买 nike

我正在使用带有 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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com