• SCAN 命令每次迭代都会返回一个游标,而用户需要手动地将这个游标用作下次迭代时的输入参数,如果用户不小心丢失或者弄错了这个游标的话,那么就可能会给迭代带来错误或者麻烦。

    为了解决以上这两个问题,我们可以在 SCAN 命令的基础上进行一些修改,实现出代码清单 11-1 所示的迭代器:这个迭代器不仅会自动记录每次迭代的游标以防丢失,它还可以直接返回被迭代的数据库键以供用户使用。


    代码清单 11-1 数据库迭代器:/database/db_iterator.py


    注解

    redis-py 提供的迭代器

    实际上,redis-py 客户端也为 命令实现了一个迭代器 ——用户只需要调用 redis-py 的 scan_iter() 方法,就会得到一个 Python 迭代器,然后就可以通过这个迭代器对数据库中的键进行迭代:

    redis-py 提供的迭代器跟 DbIterator 一样,都可以让用户免去手动输入游标的麻烦,但它们之间也有不少区别:

    • redis-py 的迭代器也拥有 方法,但这个方法每次被调用时只会返回单个元素,并且它在所有元素都被迭代完毕时将抛出一个 StopIteration 异常。

    以下是一个 redis-py 迭代器的使用示例:

    因为 redis-py 为 scan_iter() 提供了直接支持,它比需要额外引入的 DbIterator 更为方便一些,所以本书之后展示的所有迭代程序都将使用 scan_iter() 而不是 。不过由于这两个迭代器的底层实现是相仿的,所以使用哪个其实差别都并不大。