Python中如何使用Redis遍历出全部的键值对?
请教下各位,redis 如何遍历出全部的键值对
Python中如何使用Redis遍历出全部的键值对?
4 回复
key 不多的话直接 keys *
key 多的话用 scan
import redis
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 方法1:使用scan_iter(推荐用于生产环境)
def get_all_keys_scan():
"""使用scan_iter遍历所有键,避免阻塞"""
all_data = {}
for key in r.scan_iter():
value = r.get(key)
if value is not None:
all_data[key.decode('utf-8')] = value.decode('utf-8')
return all_data
# 方法2:使用keys(仅适用于数据量小的场景)
def get_all_keys_direct():
"""直接获取所有键(慎用,可能阻塞服务)"""
all_data = {}
keys = r.keys('*')
for key in keys:
value = r.get(key)
if value is not None:
all_data[key.decode('utf-8')] = value.decode('utf-8')
return all_data
# 示例用法
if __name__ == '__main__':
# 先插入一些测试数据
r.set('user:1', 'Alice')
r.set('user:2', 'Bob')
r.set('config:timeout', '30')
# 使用scan方法获取
data = get_all_keys_scan()
print("使用scan_iter获取的数据:")
for k, v in data.items():
print(f"{k}: {v}")
# 输出:
# user:1: Alice
# user:2: Bob
# config:timeout: 30
关键点说明:
-
scan_iter vs keys:
scan_iter()是增量式迭代,不会阻塞Redis服务,适合生产环境keys('*')会一次性返回所有键,数据量大时会严重影响性能
-
编码处理:
- Redis返回的是bytes类型,需要
.decode('utf-8')转字符串 - 使用前检查
value is not None,避免键已过期的情况
- Redis返回的是bytes类型,需要
-
数据类型考虑:
- 如果值不是字符串类型(如hash/list/set),需要用对应的方法获取
- 示例只展示了字符串类型,其他类型需要相应调整
简单总结:生产环境用scan_iter,测试用小数据可以用keys。
ns_keys = “kwd:*”
cursor = ‘0’
while cursor != 0:
cursor, keys = redis_conn.scan(cursor=cursor, match=ns_keys, count=100)
我也喜欢 keys *

