redis使用HyperLogLog

Posted 知识追寻者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis使用HyperLogLog相关的知识,希望对你有一定的参考价值。

This browser does not support music or audio playback. Please play it in Weixin or another browser.

一 HyperLogLog 介绍

  • Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
  • 在 Redis 中,HyperLogLog 是它的一种高级数据结构, 其功能结构类似于Set;
  • HyperLogLog  经常使用于系统数据的不精确去重,标准误差为0.81%;
  • 每个 HyperLogLog 键只需要12 KB 内存,就可以统计 2^64 个不同的元素;
  • HyperLogLog  提供了两个指令用于计数统计,pfadd 为 添加数据;pfcount 为统计数据个数;

pfadd 指令来源于  Philippe Flajolet  发明了 HyperLogLog 这种数据结构,所以pf就是指其姓名的缩写;我们之前说过 HyperLogLog  这种数据结构能起到不精确确的去重效果,但必须是亿级流量的数据以上,否则就是浪费空间,因为每个键需要占据12kb的存储空间;

使用示例如下

127.0.0.1:6379> pfadd abin zk1
(integer) 1
127.0.0.1:6379> pfadd abin zk2
(integer) 1
127.0.0.1:6379> pfcount abin
(integer) 2
127.0.0.1:6379> pfadd abin zk3
(integer) 1
127.0.0.1:6379> pfcount abin
(integer) 3
127.0.0.1:6379>

HyperLogLog   还提供了 pfmerge 指令用于合并key,的到的结果是去重后的并集;

二 使用场景

  • 统计注册 IP 数
  • 统计每日访问 IP 数
  • 统计页面实时 UV 数
  • 统计在线用户数
  • 统计用户每天搜索不同词条的个数

三 java实现

java实现非常简单,使用jedis方式实现代码如下;使用 pfadd指令 添加 1w条数据,最终计算的结构是 10055 条;多了 55条, 可见统计是存在一些误差,但在大数据情况下一些误差是完全更够接收;

  @Test
    public void testHyperLogLog(){
        // 插入1W条数据
        Jedis jedis = jedisUtil.getJedis();
        for (int i=0; i < 10000; i++){
            jedis.pfadd("abin","zk"+i);
        }
        long abinCount = jedis.pfcount("abin");
        //10055
        System.out.println(abinCount);
        jedis.close();
    }

四 HyperLogLog 原理

HyperLogLog 原理实现非常复杂,但使用方式非常简单;我对这类算法的兴趣也不是很高,有兴趣的可以参考如下文章进行学习

https://juejin.im/post/6844903785744056333

https://zhuanlan.zhihu.com/p/58519480

五 思考

HyperLogLog  与 布隆过滤器都起到了去重效果,它们之间有什么区别?


以上是关于redis使用HyperLogLog的主要内容,如果未能解决你的问题,请参考以下文章

初识Redis的数据类型HyperLogLog

Redis 如何使用 HyperLogLog

redis的HyperLogLog有啥用

Redis进阶学习05---Feed流,GEO地理坐标的应用,bitmap的应用,HyperLogLog实现UV统计

redis之HyperLogLog

Redis HyperLogLog及应用