Redis多List批量获取问题:Python Lrange无法识别通配符
解决Redis批量获取通配符匹配List数据的问题
你遇到的问题根源是:Lrange 仅支持操作单个具体的Redis Key,它不会将*解析为通配符,所以直接传入test-{id}-*作为参数,Redis会去找名字完全等于这个字符串的List,自然返回空值。
正确的处理流程应该分两步:先获取所有符合通配符模式的Key,再逐个遍历这些Key分批读取List内容。
关键注意点
别用KEYS命令获取匹配的Key:在Key数量较多时,KEYS会阻塞Redis服务,影响其他业务,推荐用SCAN命令迭代获取,它是渐进式的,不会阻塞服务。
代码示例
import redis def get_all_list_data(conn, pattern, batch_size=1000): all_data = [] # 用SCAN迭代获取所有匹配的Key cursor = 0 while True: cursor, keys = conn.scan(cursor=cursor, match=pattern, count=100) for key in keys: # 遍历每个Key,分批读取List内容 start = 0 while True: batch = conn.lrange(key, start, start + batch_size - 1) if not batch: break all_data.extend(batch) start += batch_size if cursor == 0: break return all_data # 调用示例 conn = redis.Redis(host='your_host', port=6379, db=0) target_id = "xxx" # 替换为你的实际ID值 result = get_all_list_data(conn, f'test-{target_id}-*')
代码说明
- SCAN迭代获取Key:循环调用
scan直到游标返回0(表示所有匹配Key已获取),count参数用于提示单次返回的Key数量(Redis会根据实际情况调整,并非严格遵循)。 - 分批读取单个List:对每个匹配到的Key,从
start位置开始,用lrange每次取batch_size条数据,直到返回空列表(说明该List已读取完毕)。 - 汇总数据:将所有分批读取的数据存入统一列表,最后返回完整结果。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

