如何高性能记录UV、设备去重

1 如何计算UV

最简单的计算UV的方式,就是把所有请求的用户id放到set中进行去重,每次用户请求时,都要先获取请求用户列表,再把新用户放入列表去重,再写回列表。
但是这样明显随着用户的增长,所需要的空间将会无限制的扩大,非常不可行。

第二种高级一点的,就是用BitMap或者布隆过滤器,
bitmap使用位运算来减少所消耗的空间,假如用户id为long类型,在java中,一个long需要8字节也就是64位空间存储,如果改用bitmap方法,将会缩小64倍的空间占用。
而布隆过滤器所消耗的空间和你所要达到的误差率有关,误差率越低,所需空间越高,而且误差率一定存在,无法避免。

第三种,就是使用redis中的hyperLogLog数据结构,redis中基于hyperLogLog基数计数算法,可以让使用者方便的进行UV统计等去重需求,而且在redis中每个key固定占用12KB空间,如果系统中用户数过多,建议使用该方法进行统计UV。

注意:布隆过滤器和hyperLogLog都无法实现在已有UV记录中移除用户的操作,也就是只能增加用户,无法减少。
hyperLogLog也无法实现判断用户有没有在UV记录中。

2 如何使用redis hyperLogLog

关于hyperLogLog的命令其实很少只有以下几条

  1. PFADD
    PFADD用于向指定key中放入elements,如果要进行UV统计,那么输入命令如下
    PFADD uv_key  312 4568  3422
    
    在添加元素是会进行自动去重,但是有误差率
  2. PFCOUNT
    PFCOUNT用于获取指定key中元素的总数,示例如下
    PFCOUNT uv_key
  3. PFMERGE
    PFMERGE这个命令用的场景比较少一点,用于合并多个hyperLogLog。
    比方说,我每个页面单独记录了UV,这是我想查询所有页面的总UV数,就可以用改命令进行合并。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值