如何高性能记录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数,就可以用改命令进行合并。

你可能感兴趣的:(如何高性能记录UV、设备去重)