《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