Redis-py中scan()返回空但dbsize大于0,求高效取指定数量键的方法
Redis Scan返回空但Dbsize大于0的问题及解决办法
问题原因
scan(count=n)里的count参数并不是强制返回n个键,它只是给Redis服务器一个“期望返回键数量”的提示。实际返回的键数完全由Redis内部哈希槽分布决定,当数据库处于大量写入/删除的时段时,键的哈希分布变化快,或者当前扫描的哈希槽刚好没有键,就会出现单次调用返回空列表,但dbsize()显示有键的情况。
正确的Scan用法(获取指定数量的键)
scan依然是替代keys()的最优选择(keys()会阻塞Redis,影响性能),但需要通过循环迭代游标,直到收集到足够数量的键或遍历完所有键。示例代码如下:
REDIS_SERVER = redis.Redis( host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, decode_responses=True ) target_count = 5 collected_keys = [] cursor = 0 while cursor != 0 or not collected_keys: cursor, batch_keys = REDIS_SERVER.scan(cursor=cursor, count=target_count) collected_keys.extend(batch_keys) # 收集到足够数量就提前停止 if len(collected_keys) >= target_count: break # 截取到目标数量的键 final_keys = collected_keys[:target_count] db_size = REDIS_SERVER.dbsize()
注意事项
- 循环中需持续传递游标
cursor,直到游标回到0(表示遍历完所有键) - 若扫描过程中Redis内的键被删除/新增,可能出现重复或遗漏的键,这是scan的固有特性,大部分场景下可接受
内容的提问来源于stack exchange,提问作者Mehdi 343
相关产品推荐
相关产品推荐

