Redis 多方式实现计数器功能
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》
计数器在很多网站中都进行了广泛的应用,比如文章的点赞数、页面的浏览数、网站的访客数、视频的播放数等等。在这篇文章里,我会使用 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
在实际应用中,以上代码需要稍作改动,但基本的思路不变。怎么样,你学会了吗?
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
分布式及高可用元数据采集原理
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 引言: 元数据采集是元数据产品的核心部分,如何提升采集效率是需要仔细斟酌的事情,既要保持稳定性也要保持跟上主流技术的发展趋势。元数据产品从最初集中式WEB应用系统到现在流行的分布式、微服务这种系统架构,原有元数据采集效率已不能满足应用的需求了。 目录: 1.元数据采集原理 2.分布式采集策略 3.分布式采集策略的应用 1.元数据采集原理 我们要想采集元数据首先得明白,什么是元数据,元数据都存在哪里,为什么采集元数据? 元数据MetaData通俗的解释是用来描述数据的数据,实际来看,除了业务逻辑直接读写处理的那些业务数据,所有其它用来维持整个系统运转所需的信息/数据都可以叫作元数据。比如数据库的Schema、Table、Column信息,任务的血缘关系,用户和脚本/任务的权限映射关系信息等等。 以大数据平台为例,元数据贯穿大数据平台数据流动的全过程,主要包括数据源元数据、数据加工处理过程元数据、数据主题库专题库元数据、服务层元数据、应用层元数据等。 数据治理关键就是收集信息,很明显,没有数据就无从分析,也就无法有效的...
- 下一篇
数据分析师必备的9大技能,大多数人只知道一半
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 昨天有位刚入行数据分析的朋友跟我吐槽,自己入门到现在只会用excel做做分析图表,但是感觉越做越没有价值,数据分析似乎就是业务数据的分析员,不知道该如何提升自己。 这是因为他没有完全把数据分析的价值挖掘出来,数据分析是为了通过对数据现象的查看来完成对产品、营销策略、运营策略的优化,不仅是对业务,更重要的是要掌握数据分析的各种技能,从能力增长上突破职业的天花板。 根据我总结的经验,一个合格的、高级的大数据分析师必须要掌握以下9种技能: 统计分析:大数定律、抽样推测规律、秩和检验、回归、预测; 可视化辅助工具:excel、BI工具、python 大数据处理框架:Hadoop、storm、spark 数据库:SQL、MySql、DB 数据仓库:SSIS、SSAS 数据挖掘工具:Matlab、R语言、python 人工智能:机器学习 挖掘算法:数据结构、一致性 编程语言:Java、python 一、统计分析 众所周知,统计学是数据分析的基石。学了统计学,你会发现很多时候的分析并不那么准确,比如很多人都喜欢用平均数去分析一个...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音