当前位置:海洋目录网 » 站长资讯 » 教育考试 » 文章详细 订阅RssFeed

【redis】使用redis位图轻松实时统计日活

来源:本站原创 浏览:40次 时间:2022-12-08

先看一个场景:如果某网站有有1亿用户,用户访问过该网站标记为活跃,如何统计网站DAU(Daily Active Use),根据DAU统计WAU或MAU。

1.使用传统的数据库表可以实现,用户只要访问了该网站则按日期,用户号插入一条记录,至少需要两个字段:

mobile/user_id
visit_date
18520200501
2020-05-01185202005002020-05-02

如果日活很高,表会迅速扩张,按日、周、月统计还需要count、sum、group效率较低,消耗了数据库资源还难以快速统计目标数据。
----2.换个思路,假设有一个大大的数组,数组可以自动扩容,每个用户是否活跃看作数组中的值(1活跃0不活跃,默认为0),数组的下标对应用户的编号(假设为所有用户生成了一套连续的编号)。数组按日期命名,dau20200501[1]=1表示1号用户2020-05-01活跃,dau20200501[100]=1表示100号用户2020-05-01活跃。活跃人数的计算就变成了计算数1的操作,1亿个0或1要占用多大的空间,我们可以估算一下:1个0或1占1个字节即可,1亿个0或1就是1亿字节:109/1024/1024≈96M 。如果使用一个1亿个元素的数组(也可以是一个文件),大约占用空间96M,大小等同输出外部文件的大小。----3.来看下redis的bitmap,位图不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作。由于字符串是二进制安全BLOB,并且其最大长度为512MB,因此它们最多可以设置2^32个不同的位。位图的最大优势之一是,它们在存储信息时通常可以极大地节省空间,位图包常用操作命令:setbit/getbit,设置位上的值,获取位上的值:

#设置key 第1位 值为1
setbit dau_0501 1 1
#设置key 第99位 值为1
setbit dau_0501 99 1
#获取key 第99位 值为1
getbit dau_0501 99

使用bitcount计算指定位数中1的个数:

#计算key 0位到10位 1的个数
bitcount dau_0501 0 10

基于上面2中的思路,第n个用户访问该网站,则把指定key的第n位标记为1,活跃用户数就是指定key中1的个数。显然这里是操作位,相比2中,一个字节为8位,估算一下占用空间:96M/8=12M,1亿的用户只需要12M的大小即可记录。

----
显然使用bitmap简单且节省空间,dau相似问题都可以转化为使用bitmap处理,如用户访问网站的时间轨迹等。这正是bitmap所擅长的:各种实时分析,使用小空间存储与目标对象id关联的布尔信息。


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net