Redis如何做UV统计

举报
赵KK日常技术记录 发表于 2023/06/29 23:17:51 2023/06/29
【摘要】 业务中遇没遇到这种情况,有一天产品或老板要你网站每个网页每天的UV数据,或者打印当前用户的某些统计信息,你如何实现?PV1    Page View(页面访问量)又叫做页面浏览量、点击量。通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。用户每打开一个网站页面就被记录1次。用户多次打开同一页面,浏览量值累计。所以,页面访问量是访客实际浏览过的网页数的总和,而不是某网站中的网页数的总...

业务中遇没遇到这种情况,有一天产品或老板要你网站每个网页每天的UV数据,或者打印当前用户的某些统计信息,你如何实现?

PV

  • 1

        Page View(页面访问量)

    又叫做页面浏览量、点击量。

    通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。用户每打开一个网站页面就被记录1次。用户多次打开同一页面,浏览量值累计。所以,页面访问量是访客实际浏览过的网页数的总和,而不是某网站中的网页数的总和。

UV

  • 1

        Unique Visitor(独立访客)

    一般地,我们可以用两个数值标准来统计访问某网站的访客,即“访问次数”和“独立访客(问)数”,访问次数和独立访客数是两个不同的概念。

    独立访客数则相当于带身份证参观展览会的访问人数,每一个出示身份证参观展览的人,无论出入几次,都只计作一次独立访问。这里所说的“身份证”,在网络上就是访客的IP地址或Cookie。

    通俗讲就是“带身份证参观展览会的访问人数”

IP

  • 1

        Internet Protocol(独立IP数)

    也称IP数,指1天内使用不同IP地址的用户访问网站的数量,同一IP无论访问了几个页面,独立IP数均为1。

    IP是基于用户广域网IP地址来区分不同的访问者的,所以,多个用户(多个局域网IP)在同一个路由器(同一个广域网IP)内上网,可能被记录为一个独立IP访问者。如果用户不断更换IP,则有可能被多次统计。

  如果统计PV非常好办,给网页做一个计数器即可,然后key的后缀加上日期,每次incr,然后统计,可以展示季度年等视图。

   但是UV不一样,UV需要去重,还存在用户登录与未登录的状态。

   如果单独设置set存储当天访问的用户id,进行add,然后可以自动去重,取出sadd就可以了,但是如果网页访问量非常大,就需要非常大的set集合,这样就比较浪费空间,因为你还有其他业务支撑。

   先不说解决方案,有人问了你有那么大访问量吗?

图片

   首先,无论何时都应考虑公司业务的大用户量,高并发的场景,以便于扩展,你怎么知道何时公司软件就火了呢,比如有一个软件叫摩托邦,是一些骑摩托爱好车的交友软件,一开始估计老板没想到会这么火,那时候用户昵称存在非法字符或者重复,后期改造的时候估计加上了,造成当前用户无法修改昵称的问题。

   那么既然如此有没有更好的解决方案呢?不是浪费内存吗?使用bitmap可以吗?用户id+日期后缀,不超过偏移量范围即可,然后结果去重?可以,如果存在则不添加,或者把新访问的替换。看起来已经最优解了?实际上不是,bitmap适合场景已经讲过,如果基数存储对象的占用空间比较大,存储大数据量时就不适合了,当然此场景也不适合bitmap

方案:HyperLogLog  版本2.8.9起,但好像很少见在低于3.x的了

注:用bitmap存储1一亿个统计数据大概需要12M内存;而在HLL中,只需要不到1K内存就能做到,牛批~

基本命令

序号

命令及描述

1

PFADD key element [element ...] 

添加指定元素到 HyperLogLog 中。

2

PFCOUNT key [key ...] 

返回给定 HyperLogLog 的基数估算值。

3

PFMERGE destkey sourcekey [sourcekey ...] 

将多个 HyperLogLog 合并为一个 HyperLogLog

pfadd增加计数

pfcount获取计数  

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

底层原理

图片

给定一系列的随机整数,记录连续0位的最大长度既是参数的maxbit

如果此处喜欢研究底层算法的可参考

https://blog.csdn.net/tannuowaqin169/article/details/79732862

场景:整合某个模块的数据,pfmerge即可

缺点:误差率0.81%会出现计算不准确的情况,如果初创公司的前几个月数据9万和10万的统计还是差距比较大的,但是后期的数据增长中,1001万和1002万这种的误差是可以接受的。

图片

收录于合集 #Redis
 6
上一篇Redis点赞新思路 bitmap下一篇Redis如何让你加到了附近的人
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。