《Redis应用实例》书摘(11):唯一计数器(使用集合实现)

唯一计数器对于每个特定的对象或动作只会计数一次。具体到统计用户数量的场景,这种计数器只会对每个不同的用户进行计数,而重复出现的同一个用户则不会被重复计数。

代码清单 CODE_UNIQUE_COUNTER 展示了基于集合键实现的唯一计数器程序。


代码清单 CODE_UNIQUE_COUNTER 使用集合实现的唯一计数器 unique_counter.py

class UniqueCounter:

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

    def include(self, item):
        """
        尝试对给定元素进行计数。
        如果该元素之前没有被计数过,那么返回True,否则返回False。
        """
        return self.client.sadd(self.key, item) == 1

    def exclude(self, item):
        """
        尝试将被计数的元素移出计数器。
        移除成功返回True,因元素尚未被计数而导致移除失败则返回False。
        """
        return self.client.srem(self.key, item) == 1

    def count(self):
        """
        返回计数器当前已计数的元素数量。
        如果计数器为空,那么返回0作为结果。
        """
        return self.client.scard(self.key)

作为例子,以下代码展示了这个唯一计数器程序的使用方式:

>>> from redis import Redis
>>> from unique_counter import UniqueCounter
>>> client = Redis(decode_responses=True)
>>> counter = UniqueCounter(client, "VisitCounter")
>>> counter.include("Peter")  # 对元素进行计数
True
>>> counter.include("Jack")
True
>>> counter.include("Tom")
True
>>> counter.include("Tom")  # 重复元素不会被计数
False
>>> counter.count()  # 查看当前计数结果
3

Tip

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