Redis系列之HyperLogLog用法简介

网友投稿 876 2022-11-20

Redis系列之HyperLogLog用法简介

Redis系列之HyperLogLog用法简介

(1)HyperLogLog简介

在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。HyperLogLog适用于大数据量的统计,因为成本相对来说是更低的,最多也就占用12kb内存

业务场景,HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计

举个例子,假如要统计一个页面的访问量(PV),这个还比较好办,可以直接用redis计数器或者直接存数据库都可以做,然后如果再加需求,现在要统计一个页面的用户访问量(UV),一个用户一天内如果访问多次的话,也只能算一次,这样的话,你可能会想到用SET集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value存储对应userId,这种方法是可行,可是访问量一多的话,假如有几千万访问量,那就麻烦了,为了统计一个访问量,要频繁创建SET集合对象

那有其它方法吗?针对上面大访问量的情况,redis是有实现了HyperLogLog算法,HyperLogLog 这个数据结构的发明人 是Philippe Flajolet 教授

Redis集成的HyperLogLog使用语法主要有pfadd和pfcount,顾名思义,一个是来添加数据,一个是来统计的,使用比较容易掌握,不过算法是比较复杂的,然后为什么用pf?是因为HyperLogLog 这个数据结构的发明人 是Philippe Flajolet教授 ,所以用发明人的英文缩写,这样我们也容易记住这个语法了

下面给出一些简单例子,启动redis客户端

127.0.0.1:6379> flushallOK127.0.0.1:6379> pfadd uv user1(integer) 1127.0.0.1:6379> pfcount uv(integer) 1127.0.0.1:6379> pfadd uv user2(integer) 1127.0.0.1:6379> pfcount uv(integer) 2127.0.0.1:6379> pfadd uv user3(integer) 1127.0.0.1:6379> pfcount uv(integer) 3127.0.0.1:6379> pfadd uv user4(integer) 1127.0.0.1:6379> pfcount uv(integer) 4127.0.0.1:6379> pfadd uv user5 user6 user 7 user8 user9 user10(integer) 1127.0.0.1:6379> pfcount uv(integer) 10127.0.0.1:6379>

然后用java的Jedis库来实现

加上Maven:

redis.clients jedis 2.9.0

写个测试类,要先启动redis服务端

package com.test.redis;import redis.clients.jedis.Jedis;public class RedisPFCountTest { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1",6379); for (int i = 0; i < 1000; i++) { jedis.pfadd("pv", String.valueOf(i)); } long total = jedis.pfcount("pv"); System.out.printf("%d\n", total); jedis.close(); }}

(2) PFMERGE 用法

pfadd和pfcount常用于统计,然后来个需求,假如两个页面很相近,现在想统计这两个页面的用户访问量呢?这里就可以用pfmerge合并统计了,语法如例子:

127.0.0.1:6379> PFADD test1 "apple" "banana" "cherry"(integer) 1127.0.0.1:6379> PFCOUNT test1(integer) 3127.0.0.1:6379> PFADD test2 "apple" "cherry" "durian" "mongo"(integer) 1127.0.0.1:6379> PFCOUNT test2(integer) 4127.0.0.1:6379> PFMERGE test1&test2 test1 test2OK127.0.0.1:6379> PFCOUNT test1&test2(integer) 5

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:oracle应用之使用sequence批量写数据
下一篇:oracle应用之批量新增更新数据
相关文章

 发表评论

暂时没有评论,来抢沙发吧~