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

关键点说明:

  1. scan_iter vs keys

    • scan_iter() 是增量式迭代,不会阻塞Redis服务,适合生产环境
    • keys('*') 会一次性返回所有键,数据量大时会严重影响性能
  2. 编码处理

    • Redis返回的是bytes类型,需要.decode('utf-8')转字符串
    • 使用前检查value is not None,避免键已过期的情况
  3. 数据类型考虑

    • 如果值不是字符串类型(如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 *

回到顶部