利用Redis统计网站在线活跃用户的方法
前言
在工作中我们经常遇到这样的需求,要对某个在线网站的活跃用户数量进行统计。这里我们以redis为例,说明一下其实现的过程。
实现方法
在Redis中存在bitmap这种数据类型,这种数据类型是建立在string数据类型之上的。这里,我们主要用到setbit、bitcount这2个命令,而使用的客户端为python的redis库。
import redis r = redis.StrictRedis(host="127.0.0.1",port=6379,db=0)
这里我们引入redis库,然后实例化了1个StrictRedis类。由于这里使用的默认的选项,我们可以在StrictRedis不传入任何参数。
r = redis.StrictRedis()
这里我们定义3个方法storeDailyVisit,removeDailyVisit和countVisits,分别用于用户上线时进行记录、用户下线时进行记录以及查看指定日期活跃的用户总数。
下面我们来看storeDailyVisit函数:
def storeDailyVisit(date,userId,verbose=False): key = "visits:daily:"+date r.setbit(key,userId,1) if verbose: print("User",userId,"visited on",date)
该函数接收2个参数date和userId,分别为指定的日期和用户的ID,第3个参数用于指定是否输出内容。在这里我们输出用户访问的信息,当然我们可以将其记录在日志中等其他操作。
当某个用户登录后,我们调用该函数,传入今天的日期及用户的ID。removeDailyVisit函数与storeDailyVisit函数类似,它主要负责当用户退出当前网站时将其从bitmap表中移除。
def removeDailyVisit(date,userId,verbose=False): key = "visits:daily:"+date r.setbit(key,userId,0) if verbose: print("User",userId,"leave on",date)
下面我们通过countVisits函数得到当前活跃的用户的数量:
def countVisits(date): key = "visits:daily:"+date return r.bitcount(key)
这里,countVisits函数接收1个日期的参数,它通过调用bitmaps数据类型的bitcount函数得到当前数字为1的个数。这里我们将它返回给调用者。
由于bitmaps是1种按位进行操作的数据类型,其是1串连续的二进制数字(0或1)。我们通过对其某个位上的数值进行设置为1,然后通过bitcount函数统计这串二进制数字上为1的总数,从而得到当前活跃的用户总数。
另外,我们还可以使用redis的set数据类型来实现同样的操作,我们可以通过下表来查看这二者的差别:
| 数据类型 | 每个消耗的位 | 存储用户 | 消耗的内存 | |———-|—————|————|——————| | bitmap | 1bit | 500000000 |1*500000000B=59.6Mb| | set | 32bit | 500000000 |32*500000000B=1.91Tb|
我们可以清楚的看到,当存储的用户为5个亿的时候,需要消耗的内存bitmap为59.6MB,而set为1.91TB,整整32倍。因此,在实际的在线网站中,我们更多使用的是bitmaps统计在线用户的数量。
参考文章:http://redis.io/topics/data-types-intro#bitmaps
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 利用Redis统计网站在线活跃用户的方法
相关文章
- Redis分布式锁python-redis-lock使用方法
- Redis存储文件的功能与优势(redis存文件)
- 查看Redis版本的简易方法(怎样查看redis版本)
- 缓存如何验证Redis缓存的有效性(怎么验证redis)
- 异步写入Redis节点的通知(异步通知redis)
- 优化并发查询Redis的方法(并发查询redis)
- 揭开Redis持久化的神秘之谜(解密redis持久化)
- 在虚拟机上搭建Redis数据库的方法(虚拟机上的redis地址)
- 探索Redis之旅追求最新版本号(获取redis版本号)
- 五种使用Redis进行数据缓存的方法(缓存redis的五中方式)
- 实现实现省市区三级联动Redis解决方案(省市区三级联动redis)
- 过度服务,Redis挂掉,急需解救(服务过多redis卡死)
- 利用Redis实现接口限流的有效方法(接口限流redis)
- 大规模锁定Redis,实现批量操作(批量操作redis加锁)
- 单点登录流程优化使用Redis轻松实现(单点登录要用redis)
- 前端实现直接操作Redis(前端直接连redis)
- 分页技术优化Redis性能(分页 redis)
- 如何快速部署Redis环境(如何部署redis环境)
- 解决Redis连接过多的方法(处理redis连接过多)
- Redis雪崩有效解决之道(redis雪崩的解决方法)
- 重新启动,畅享Redis集群服务(redis集群服务重启)
- 解决Redis集群数据不均衡的方法(redis集群数据不均衡)
- 使用Redis实现高性能队列(redis队列怎么写)
- 解决Redis键空格问题的方法(redis键空格问题)
- 利用Redis的INCR实现计数器功能(redis里incr方法)
- Redis调用超时可能的原因及处理方法(redis调用超时)
- Redis实现访问统计简单有效的实践方法(redis 访问统计)
- 池利用Redis缓冲池实现消息队列(redis消息队列 缓冲)