利用Redis统计网站在线活跃用户的方法

所属分类: 数据库 / Redis 阅读数: 149
收藏 0 赞 0 分享

前言

在工作中我们经常遇到这样的需求,要对某个在线网站的活跃用户数量进行统计。这里我们以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

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

更多精彩内容其他人还在看

Redis中一些最常见的面试问题总结

Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。下面这篇文章主要给大家总结介绍了关于Redis中一些最常见的面试问题,需要的朋友可以参考下
收藏 0 赞 0 分享

Redis中键的过期删除策略深入讲解

这篇文章主要给大家介绍了关于Redis中键的过期删除策略的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Linux安装单机版Redis的完整步骤

这篇文章主要给大家介绍了关于Linux安装单机版Redis的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Redis分析慢查询操作的实例教程

这篇文章主要给大家介绍了关于Redis如何分析慢查询操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Redis未授权访问配合SSH key文件利用详解

这篇文章主要给大家介绍了关于Redis未授权访问配合SSH key文件利用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

redis中队列消息实现应用解耦的方法

这篇文章主要给大家介绍了关于redis中队列消息实现应用解耦的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

redis的主从配置方法详解

今天为大家介绍下linux系统下redis的主从配置方法,Linux系统下的redis的主从配置方法非常简单下面是具体的操作步骤
收藏 0 赞 0 分享

Redis Template实现分布式锁的实例代码

使用Redis的SETNX命令获取分布式锁的步骤,接下来通过本文给大家介绍Redis Template实现分布式锁的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

Redis Sentinel实现高可用配置的详细步骤

这篇文章主要介绍了Redis Sentinel实现高可用配置的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Centos7.3安装Redis4.0.6详细图文教程

这篇文章主要介绍了Centos7.3安装Redis4.0.6详细教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多