Redis如何做UV统计
业务中遇没遇到这种情况,有一天产品或老板要你网站每个网页每天的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万这种的误差是可以接受的。
- 点赞
- 收藏
- 关注作者
评论(0)