redis数据结构HyperLogLog

HyperLogLog是一种概率算法,用于在不存储所有值的情况下估算大型集合的基数,常用于统计独立访客UV。在Redis中,HLL基于string结构,内存占用极低,虽然存在小于0.81%的误差,但适合UV统计。示例代码展示了如何使用HLL添加数据并获取估算的集合大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HyperLogLog

首先我们搞懂两个概念:

UV: 全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。

PV: 全称Page View,也叫页面访问量或点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网站的流量。

UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。但是如果每个访问的用户都保存到Redis中,数据量会非常恐怖。

HyperLogLog用法

Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。

redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb,内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差。不过对于UV统计来说,这完全可以忽略。

代码实现

 void test5() {
        String[] strArray = new String[1000];
        int index = 0;
        String key = "hl2";
        for (int i = 0; i < 1000000; i++) {
            index = i % 1000;
            strArray[index] = "test" + i;
            if(index == 999){
                stringRedisTemplate.opsForHyperLogLog().add(key,strArray);
            }
        }

        Long size = stringRedisTemplate.opsForHyperLogLog().size(key);
        System.out.println("size = " + size);
    }
### Redis HyperLogLog 数据结构概述 Redis HyperLogLog 是一种概率性的数据结构,专门设计用来估计集合中不同元素的数量(即基数)。这种算法能够在消耗极少量内存的情况下提供相对精确的结果[^1]。 ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) # 初始化连接到本地的Redis实例 ``` ### 创建与操作HyperLogLog对象 为了向HyperLogLog添加新元素或者查询当前已知的不同元素总数,可以分别使用`PFADD`和`PFCOUNT`命令。对于需要合并两个或更多HyperLogLogs的情况,则可利用`PFMERGE`指令来完成这一任务[^4]。 #### 添加元素至HyperLogLog 当有新的唯一标识符(比如用户的ID)加入时,可以通过调用 `PFADD key element [element ...]` 来更新对应的HyperLogLog记录: ```bash PFADD visitors user_12345 PFADD visitors user_67890 ``` 上述命令会把字符串形式表示的新访客ID插入名为visitors的HyperLogLog变量里;如果有重复项存在的话并不会影响最终计数结果。 #### 获取不重复元素数目 要获取某个特定HyperLogLog所含有的近似独特成员个数,只需执行如下语句即可得到返回值——一个整数类型的估算量: ```bash PFCOUNT visitors ``` 此命令适用于单个HyperLogLog键名作为参数传入的情形下求得其内部保存了多少种不同的条目[^5]。 #### 合并多个HyperLogLog实例 假设现在有两个分开维护的日志文件A.log和B.log,并且各自对应着两套相互独立但又想汇总起来分析访问趋势的HyperLogLog结构体X和Y。那么就可以借助于`PFMERGE destkey sourcekey [sourcekey ...]`来进行融合处理: ```bash PFMERGE combined X Y ``` 这条SQL风格的表述意味着将名称分别为X,Y中的全部观测样本整合进目标容器combined之中以便后续统一管理。 ### 高效性特点 值得注意的是,在涉及大量数据集的时候,无论是增加还是读取HyperLogLog里的信息都保持着常数级别的运算开销(O(1)),这使得即便面对海量级别的输入也能迅速响应而不至于造成性能瓶颈问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值