Redis特殊数据类型Hyperloglog详解

    科技2024-08-08  26

    5.2.1 基数统计使用场景及优点

    那什么是基数?

    A {1,3,5,7,8,7}

    B {1,3,5,7,8}

    基数用大白话来讲解,就是一个集合中不重复的元素,可以接受误差

    那集合A与集合B的基数都是5

    Redis2.8.9版本就已经更新了,Hyperloglog是一种数据结构

    Hyperloglog 是基数统计的算法

    优点:

    占用的内存是固定的,

    如果要存数据,hyperloglog存2^64的数据只需要占用12kb内存

    如果要从内存角度比较,hyperloglog首选

    实际场景:

    网页的UV(页面访问量用户数):

    一个人访问一个网站多次,最后还是算作一个人

    传统方式: 使用set集合保存用户id,因为set集合中不允许元素重复,我们就可以统计set集合中的元素数量,作为标准判断

    但是如果用set集合保存用户id,有的用户id是分布式的,特别特别长,这个方式如果保存大量的用户id,就会比较麻烦,因为比较占内存

    我们的目的是为了计数,而并不是保存用户id

    现在我们有了hyperloglog特殊数据类型后,就可以基于基数来计算访问量

    所有的关于hyperloglog的命令都是以p开头的


    5.2.2 pdadd&pfcount命令详解

    pfadd 新增

    pfcount 统计基数

    ##新增元素 127.0.0.1:6379> pfadd hyper1 a b c d e f (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper1 (integer) 6 ##新增元素 127.0.0.1:6379> pfadd hyper2 g h i l k (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper2 (integer) 5 ##新增元素 127.0.0.1:6379> pfadd hyper3 a a a b e r d (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper3 (integer) 5 127.0.0.1:6379>

    5.2.3 pfmerge命令详解

    pfmerge destkey sourcekey [sourcekey …]

    ##新增元素 127.0.0.1:6379> pfadd hyper1 a b c d e f (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper1 (integer) 6 ##新增元素 127.0.0.1:6379> pfadd hyper2 g h i l k (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper2 (integer) 5 ##新增元素 127.0.0.1:6379> pfadd hyper3 a a a b e r d (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper3 (integer) 5 ##合并,做并集运算 127.0.0.1:6379> pfmerge hyper4 hyper1 hyper2 hyper3 OK ##统计基数 127.0.0.1:6379> pfcount hyper4 (integer) 12 127.0.0.1:6379>

    以后我们要是需要做计数场景,都可以使用hyperloglog,只要允许容错,它有0.81%的错误率,如果不允许容错,就可以使用set或者自己的数据类型即可

    Processed: 0.009, SQL: 8