《Redis应用实例》书摘(7):自动递增数字ID生成器(字符串实现)

传统SQL数据库可以使用SERIAL等类型创建连续的自动递增数字ID,并将其用作检索数据或是连接数据时的标识符。但由于Redis直接使用键名作为检索数据的标识符,而且每个应用程序的键名通常都各不相同,所以Redis并未内置自动的数字序列ID生成机制。

尽管如此,数字ID作为通用的数据标识手段仍然非常常见,对于很多使用Redis的应用程序来说也是不可或缺的。为此,我们可以通过Redis的字符串或是哈希数据结构来创建自动递增的数字ID,具体的方法将在接下来的内容中介绍。

代码清单 CODE_ID_GENERATOR 展示了基于字符串键实现的自增数字ID序列生成器。


代码清单 CODE_ID_GENERATOR 使用字符串键实现的ID生成器 id_generator.py

class IdGenerator:

    def __init__(self, client, name):
        self.client = client
        self.name = name

    def produce(self):
        """
        生成并返回下一个ID。
        """
        return self.client.incr(self.name)

    def reserve(self, n):
        """
        尝试保留前N个ID,使得之后生成的ID都大于N。
        这个方法只能在执行produce()之前执行,否则函数将返回False表示执行失败。
        返回True则表示保留成功。
        """
        return self.client.set(self.name, n, nx=True) is True

作为例子,以下代码展示了如何使用这个程序保留前一百万个ID,并在之后生成连续的数字ID:

>>> from redis import Redis
>>> from id_generator import IdGenerator
>>> client = Redis(decode_responses=True)
>>> gen = IdGenerator(client, "UserID")
>>> gen.reserve(1000000)  # 保留前一百万个ID
True
>>> gen.produce()  # 生成后续ID
1000001
>>> gen.produce()
1000002
>>> gen.produce()
1000003
>>> gen.reserve(9999)  # 这个方法无法在生成ID之后调用
False

Tip

本文摘录自《Redis应用实例》一书。
欢迎访问书本主页以了解更多Redis使用案例:huangz.works/rediscookbook/
../_images/rediscookbook-banner.png