《Redis应用实例》书摘(17):数据库迭代器¶
迭代器是一个非常重要的数据库特性,它可以让用户分批获取数据库中的数据,而不是一次性获取整个数据库的全部数据,因为后一种做法在数据量巨大的时候很容易会造成服务器阻塞。
Redis向用户提供了SCAN命令以迭代数据库中的键,但这个命令只有在接收到正确的游标时才会正确地运行,而手动维护和更新游标往往容易造成错误。
为了解决这个问题,本章将构建一个Redis数据库迭代器,由它负责封装和调用SCAN命令,并在迭代过程中不断地自动更新游标,使得用户在迭代过程中无需关心游标。
代码清单 CODE_DB_ITERATOR 展示了基于这一原理实现的数据库迭代程序。
代码清单 CODE_DB_ITERATOR 数据库迭代器程序 db_iterator.py
DEFAULT_COUNT = 10
class DbIterator:
def __init__(self, client, count=DEFAULT_COUNT):
"""
初始化数据库迭代器。
可选的count参数用于建议迭代器每次返回的键数量。
"""
self.client = client
self.count = count
self._cursor = 0
def next(self):
"""
迭代数据库,并以列表形式返回本次被迭代的键。
"""
# 迭代已结束,直接返回None作为标志
if self._cursor is None: return
new_cursor, keys = self.client.scan(self._cursor, count=self.count)
# 通过命令返回的新游标来判断迭代是否已结束
if new_cursor == 0:
# 迭代已结束
self._cursor = None
else:
# 迭代未结束,更新游标
self._cursor = new_cursor
# 返回被迭代的键
return keys
def rewind(self):
"""
重置迭代游标以便从头开始对数据库进行迭代。
"""
self._cursor = 0
作为例子,以下代码展示了如何使用这个迭代程序来迭代整个数据库:
>>> from redis import Redis
>>> from db_iterator import DbIterator
>>> from random_key_generator import random_key_generator
>>> random_key_generator(client, 13) # 创建13个类型随机的键
>>> iterator = DbIterator(client, 5) # 建议每次迭代获取5个键
>>> iterator.next() # 第一次迭代
['Key:7322915482', 'Key:7546531131', 'Key:2090130470', 'Key:6992086739', 'Key:2298694274', 'Key:8939973113']
>>> iterator.next() # 第二次迭代
['Key:7449569114', 'Key:3325812056', 'Key:0422676670', 'Key:8520951905', 'Key:9120617026']
>>> iterator.next() # 第三次迭代
['Key:5081797988', 'Key:0616761883']
>>> iterator.next() # 迭代完毕
>>>