为何Redis SCAN用相同匹配模式返回空,KEYS却有结果?
SCAN匹配返回空/多次迭代才找到结果的原因及说明
你的操作本身没有错误,这是SCAN命令的特性导致的正常现象,具体拆解如下:
1. SCAN与KEYS的匹配逻辑本质不同
KEYS是遍历整个键空间,直接筛选出所有符合匹配模式的键,所以能一次性返回12条结果,但这个命令在大键空间下会阻塞Redis,生产环境不推荐使用。- 而
SCAN是先从键空间里取出一批键(数量由COUNT参数影响,但不保证精准),再对这批键做MATCH过滤。你的匹配模式Types/*/*BackgroundJob.json覆盖的键占比极低,大部分迭代取出的批量键里都没有符合条件的,所以会多次返回空结果,直到某次取出的批量恰好包含目标键才会返回。
2. COUNT参数不是强制返回数量
- COUNT只是给Redis的一个提示值,不是必须返回的键数。Redis会根据键空间大小、哈希表结构调整实际返回的键数量,哪怕设了COUNT=1000,也可能返回空或者远少于1000的键。
- 你的场景里键空间应该比较大,目标键占比又低,所以需要上千次迭代才遍历到所有目标键,这完全符合SCAN的工作机制。
3. 优化建议
- 确保SCAN循环逻辑正确:必须迭代到游标返回0,才算完成整个键空间的遍历,不能中途终止。
- 可以适当增大COUNT值(比如调到10000),提高每次迭代命中目标键的概率,减少总迭代次数,但依然无法保证一次返回结果。
- 如果业务允许,给这类键调整更统一的前缀(比如
BackgroundJob:Types:*),缩小匹配范围的同时,能提升SCAN的筛选效率。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

