Redis高级数据结构之HyperLogLog

115 阅读2分钟

HyperLogLog的介绍

  • 这并不是一种全新的数据结构、实际类型是一种字符串类型。
  • 通过一种基数(不重复的元素数量就是基数)算法,便可以使用很小的内存空间完成独立总数的统计。
  • 数据集可以是IP、Email、ID等
  • 官方给出的统计误差是0.81%,能满足市面上绝大多数的UV统计需求。

HyperLogLog的常用操作命令

操作命令中的pf为了纪念这个算法的提出者 Philippe Flajolet 在这里插入图片描述

  • 向HyperLogLog添加元素、添加成功返回1
  • pfadd key element [element ...] 在这里插入图片描述
  • 计算一个或者多个HyperLogLog的独立总数 在这里插入图片描述
  • 重复向HyperLogLog中插入元素,统计值会存在误差、存在误差的概率 在这里插入图片描述
  • 求多个HyperLogLog的并集
  • pfmerge destkey sourcekey [sourcekey ... ]
  • 求出的结果放到 sourcekey 在这里插入图片描述

原理概述

基本原理便是HyperLogLog基于概率论中的伯努利试验并结合了极大的似然估算方法,做了分桶优化。 redis中的HyperLogLog在传统的分桶优化基础之上,还采用调和平均数过滤掉不健康的统计值。

Redis中的原理分析

  • 通过hash函数将传入的数据转化为64位的二进制比特串,并根据比特串的位数求出转化为1的最大位置k_max来求出存入了多少数据
  • 根据转化为的64位比特串的后14位作为分桶的依据,也就是2的14次方,一共分16384个桶。达到降低误判的作用
  • 然后比特串的前50位则依据从左往右第一个出现1的位数分别进入不同的桶中。所以每个桶中最大就存储50,总共是6位二进制比特串。110010

计算一个HyperLogLog的key占用的存储空间

一个key占用16384个桶x6位/8=12288b/1024=12KB