Redis 多方式实现计数器功能

更新日期: 2019-09-15 阅读: 2.8k 标签: Redis

计数器在很多网站中都进行了广泛的应用,比如文章的点赞数、页面的浏览数、网站的访客数、视频的播放数等等。在这篇文章里,我会使用 Redis 的三种数据类型,来分别实现计数器的功能。

请跟随我一起来看看吧。


使用字符串键

下面代码演示了如何利用 Redis 中的字符串键来实现计数器功能。其中,incr() 方法用于累加计数,get_cnt() 方法用于获取当前的计数值。

from redis import Redis 
 
class Counter: 
    def __init__(self, client: Redis, key: str): 
        self.client = client 
        self.key = key 
 
    def incr(self, amount=1): 
        """计数累加""" 
        self.client.incr(self.key, amount=amount) 
 
    def decr(self, amount=1): 
        """计数累减""" 
        self.client.decr(self.key, amount=amount) 
 
    def get_cnt(self): 
        """获取当前计数的值""" 
        return self.client.get(self.key) 
 
 
if __name__ == '__main__': 
    client = Redis(decode_responses=True) 
    counter = Counter(client, 'page_view:12') 
    counter.incr() 
    counter.incr() 
    print(counter.get_cnt())  # 2 

假设我们要统计 page_id 为 12 的页面的浏览数,那么我们可以设定 key 为 page_view:12,用户每一次浏览,就调用一次 counter 的 incr() 方法进行计数。


使用哈希键

在上面的代码中,我们需要针对每个统计项,都单独设置一个字符串键。那么,下面我们来看看如何通过 Redis 的哈希键,来对关联的统计项进行统一管理。

from redis import Redis 
 
class Counter: 
    def __init__(self, client: Redis, key: str, counter: str): 
        self.client = client 
        self.key = key 
        self.counter = counter 
 
    def incr(self, amount=1): 
        """计数累加""" 
        self.client.hincrby(self.key, self.counter, amount=amount) 
 
    def decr(self, amount=1): 
        """计数累减""" 
        self.client.hincrby(self.key, self.counter, amount=-amount) 
 
    def get_cnt(self): 
        """获取当前计数的值""" 
        return self.client.hget(self.key, self.counter) 
 
 
if __name__ == '__main__': 
    client = Redis(decode_responses=True) 
    counter = Counter(client, 'page_view', '66') 
    counter.incr() 
    counter.incr() 
    print(counter.get_cnt())  # 2 

如果采用哈希键,那么,我们对于同一类型的计数,可以使用一个相同的 key 来进行存储。比如,在上面例子中,我们使用 page_view 来统计页面的浏览数,对于 page_id 为 66 的页面,直接添加到 page_view 对应的字段中即可。


使用集合键

在上面两个例子中,当动作被执行时,程序可以调用一次 incr() 累加计数的方法。某些场景下,我们可能需要对特定的动作,仅仅计数一次。什么叫“仅仅计数一次”?就是说,同一个用户/IP,多次访问某个页面,计数器只会将计数值增加 1。来看看以下代码:

from redis import Redis 
 
class Counter: 
    def __init__(self, client: Redis, key: str): 
        self.client = client 
        self.key = key 
 
    def add(self, item: str) -> bool: 
        """计数累加,若计数之前item已存在,放回False;否则返回True""" 
        return self.client.sadd(self.key, item) == 1 
 
    def get_cnt(self): 
        """获取当前计数的值""" 
        return self.client.scard(self.key) 
 
 
if __name__ == '__main__': 
    client = Redis(decode_responses=True) 
    counter = Counter(client, 'uv') 
    counter.add('user1') 
    counter.add('user2') 
    counter.add('user1')  # 重复放入 
    print(counter.get_cnt())  # 2 

在实际应用中,以上代码需要稍作改动,但基本的思路不变。怎么样,你学会了吗?


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/5945

相关推荐

Redis可视化管理工具有哪些?

redis 是当前非常流行的缓存数据库,得益于其简单的 key-value 模式的数据存储和丰富的数据类型与事件机制使得 redis 成为当前后端开发中不可或缺的利器。下面推荐一些好用的 redis 的管理工具

使用 Redis 构建先进先出队列解决秒杀问题

先进先出队列(first in first out queue)是一种非常常见的数据结构, 一般都会包含入队(enqueue)和出队(dequeue)这两个操作, 其中入队操作会将一个元素放入到队列中, 而出队操作则会从队列中移除最先被入队的元素

在使用redis-cluster之前你需要知道这些事

前段时间基础架构组、DBA还有云盘团队一起推广了phpredis的RedisCluster的线上使用,目前线上业务已经稳定,单业务的规模水平是:Qps平均15W,数据量在700G左右。现对这段时间的工作和所遇到的一些常见问题进行简单总结

基于redis实现定时任务

业务中碰到的需求(抽象描述一下):针对不同的用户能够实现不同时间的间隔循环任务。比如在用户注册成功24小时后给用户推送相关短信等类似需求。使用crontab?太重,且基本不现实,不可能给每一个用户在服务器上生成一个定时任务。

docker搭建redis集群

从docker库获取ruby镜像;创建虚拟网卡;查看网卡信息;查看redis-net虚拟网卡网关ip;创建需要挂载的目录以及文件;在/docker/redis目录下创建一个sh脚本文件;执行脚本创建挂载目录以及配置文件

redis用在哪里?redis 应用场景

Redis是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis的基本数据结构及基本命令详解

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)

Redis中设置了过期时间的Key,那么你还要知道些什么?

熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。这就是Redis的过期策略。在为key设置过期时间需要注意的事项

Redis 的各项功能解决了哪些问题?

官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用。同时支持strings,lists,hashes,sets,sorted sets

Redis分布式锁

redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.采用单进程单线程模型,并发能力强大,主流的分布式缓存工具。加锁通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!