扫描迭代
迭代处理来自 SCAN
、HSCAN
等命令的结果。
Redis 有一小部分相关的命令族,用于检索键以及(在某些情况下)其关联的值
SCAN
从主要的 Redis 键空间中检索键。HSCAN
从一个 hash 对象中检索键,并可选地检索其值。SSCAN
从一个 set 对象中检索键。ZSCAN
从一个 sorted set 对象中检索键及其分数(score)值。
这些命令可能会返回大量结果,因此 Redis 提供了一种分页机制,以便分批访问结果。使用基础命令时,您必须在代码中维护一个游标值来跟踪当前页面。作为一种便捷的替代方案,redis-py
还允许您使用迭代器访问结果。这会透明地处理分页,因此您只需在 for
循环中逐一处理它返回的项,或者将迭代器对象本身传递给需要序列的位置。
每个命令都有其对应的迭代器。以下示例展示了如何在 Redis 键空间上使用 SCAN
迭代器。请注意,与 SCAN
命令一样,结果不会按任何特定顺序排序,。此外,您可以将 match
、count
和 _type
参数传递给 scan_iter()
来限制它返回的键集(有关示例,请参见 SCAN
命令页面)。
import redis
r = redis.Redis(decode_responses=True)
r.set("key:1", "a")
r.set("key:2", "b")
r.set("key:3", "c")
r.set("key:4", "d")
r.set("key:5", "e")
for key in r.scan_iter():
print(f"Key: {key}, value: {r.get(key)}")
# >>> Key: key:1, value: a
# >>> Key: key:4, value: d
# >>> Key: key:3, value: c
# >>> Key: key:2, value: b
# >>> Key: key:5, value: e
其他命令的迭代器也以基础命令名后加上 _iter()
命名(hscan_iter()
、sscan_iter()
和 zscan_iter()
)。它们的工作方式类似于 scan_iter()
,只是您必须传递一个键来标识要扫描的对象。下面的示例展示了如何使用 zscan_iter()
迭代 sorted set 中的项。
r.zadd("battles", mapping={
"hastings": 1066,
"agincourt": 1415,
"trafalgar": 1805,
"somme": 1916,
})
for item in r.zscan_iter("battles"):
print(f"Key: {item[0]}, value: {int(item[1])}")
# >>> Key: hastings, value: 1066
# >>> Key: agincourt, value: 1415
# >>> Key: trafalgar, value: 1805
# >>> Key: somme, value: 1916
请注意,在这种情况下,迭代器返回的项是一个包含键和分数(score)两个元素的元组(tuple)。默认情况下,hscan_iter()
也返回一个包含键和值的 2 元组,但您可以为 no_values
参数传递 True
值来仅检索键
r.hset("details", mapping={
"name": "Mr Benn",
"address": "52 Festive Road",
"hobbies": "Cosplay"
})
for key in r.hscan_iter("details", no_values=True):
print(f"Key: {key}, value: {r.hget("details", key)}")
# >>> Key: name, value: Mr Benn
# >>> Key: address, value: 52 Festive Road
# >>> Key: hobbies, value: Cosplay