开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
前言
- 一个网站每天都会被人访问,正常就需要统计网站的活跃用户以及访问的频率。针对这个需要你会怎么做?你一定会说把每次用户的访问进行日志化存储,那么存放哪里?数据库压力会不会太大,你肯定会说存tdengine数据库呀,或者存es 呀, 这种服务完全没问题
redis
- 但是我想说的是我们可以使用redis来巧妙解决这个问题,他不需要多少开销就可以解决这个问题-- HyperLoglog 数据结构就是专门针对这种类似的场景的,这种数据结构主要用于在海量数据场景下进行统计,计算的问题。他的特点就是短小精悍。在这里他通过基数来进行统计的,这点和set有点类似但是HyperLoglog不存储内容,比如说HyperLoglog添加了4个元素分别是 a b c a , 那么HyperLoglog只知道有3个元素而并不知道具体哪3个元素,那么你可能会问他不知道哪3个怎么进行去重?这里就存在概率问题了,他的内部也是hash运算的,所以这里就存在一定成都的误判,官方给的说法是0.81%的概率误判,所以这中数据结构也是有一定的局限性的。
统计
- HyperLogLog 特定的使用场景就是统计网站用户月活量,或者网站页面的 UV
- 我们首先pfadd进行记录用户的活动数据,因为他的内部去重行,我们就无需额外的判断,只需要在接口中无脑的pfadd就行了。
- 然后我们在统计的时候通过
pfcount进行统计指定key的数据即可 - 正常我们统计网站用户量都是按天统计的,key的名称也是XXXX20221101这种,如果我突然想看最近7天的网站用户活跃数据呢?这样我们把7天的加起来好像就不对了,因为这里我们无法做到去重,redis给我们提供了pfmerge来合并多个key的数据。