以上这种简单的计数行为在大部分时候都是有用的,但是在某些情况下,我们需要一种要求更为严格的计数器,这种计数器只会对特定的动作或者对象进行一次计数而不是多次计数。

    举个例子,一个网站的受欢迎程度通常可以用浏览量和用户数量这两个指标进行描述:

    • 至于用户数量记录的则是访问网站的 IP 地址数量,即使同一个 IP 地址多次访问相同的页面,用户数量计数器也只会对这个 IP 地址进行一次计数。

    对于网站的浏览量,我们可以继续使用字符串键或者散列键实现的计数器进行计数;但如果我们想要记录网站的用户数量,那么就需要构建一个新的计数器,这个计数器对于每个特定的 IP 地址只会进行一次计数,我们把这种对每个对象只进行一次计数的计数器称之为唯一计数器(unique counter)。


    代码清单 5-1 使用集合实现唯一计数器:


    以下代码展示了如何使用唯一计数器去计算网站的用户数量:

    1. >>> from redis import Redis
    2. >>> from unique_counter import UniqueCounter
    3. >>> client = Redis(decode_responses=True)
    4. >>> counter.count_in('8.8.8.8') # 将一些 IP 地址添加到计数器当中
    5. True
    6. >>> counter.count_in('9.9.9.9')
    7. True
    8. >>> counter.count_in('10.10.10.10')
    9. >>> counter.get_result() # 获取计数结果
    10. 3
    11. >>> counter.count_in('8.8.8.8') # 添加一个已存在的 IP 地址
    12. False
    13. >>> counter.get_result() # 计数结果没有发生变化