扫描迭代

迭代处理来自 SCANHSCAN 等命令的结果。

Redis 有一小部分相关的命令族,用于检索键以及(在某些情况下)其关联的值

  • SCAN 从主要的 Redis 键空间中检索键。
  • HSCAN 从一个 hash 对象中检索键,并可选地检索其值。
  • SSCAN 从一个 set 对象中检索键。
  • ZSCAN 从一个 sorted set 对象中检索键及其分数(score)值。

这些命令可能会返回大量结果,因此 Redis 提供了一种分页机制,以便分批访问结果。使用基础命令时,您必须在代码中维护一个游标值来跟踪当前页面。作为一种便捷的替代方案,redis-py 还允许您使用迭代器访问结果。这会透明地处理分页,因此您只需在 for 循环中逐一处理它返回的项,或者将迭代器对象本身传递给需要序列的位置。

每个命令都有其对应的迭代器。以下示例展示了如何在 Redis 键空间上使用 SCAN 迭代器。请注意,与 SCAN 命令一样,结果不会按任何特定顺序排序,。此外,您可以将 matchcount_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
为此页评分
返回顶部 ↑