基数统计-原理和应用场景基数统计概述基数Cardinality是指一个集合中不同元素的数量或者说统计一个集合中不重复元素的个数。简单来说基数Cardinality就是去除重复后的数的个数例如对于一个包含重复元素的集合{1, 2, 2, 3, 4, 4, 4}其基数为4即不同元素的个数。在Redis中HashSet / HyperLogLog数据结构都能提供高效的基数统计而HyperLogLog算法可以在不保存原始数据的情况下快速计算出一个集合的基数。基数统计的2大类型类型 1精确计算对于较小规模的数据集可使用数据结构如哈希集合HashSet来实现基数统计。哈希集合的工作原理哈希集合利用哈希函数将元素映射到存储位置其内部会自动处理元素的插入和冲突问题。当插入一个元素时哈希集合会根据元素的哈希值确定存储位置若该位置没有元素则直接插入若已存在元素哈希冲突则通过一定的冲突解决策略如链表法或开放寻址法来处理。通过计算哈希集合中的元素数量即可得到集合的基数。类型 2近似计算原理以 HyperLogLog 为例HyperLogLog 是一种基于概率的数据结构用于估算大数据集的基数。基本原理将元素哈希为二进制串通过统计哈希值的前导零的最大长度来估算基数每个不同的元素经过哈希后其哈希值的前导零长度呈现一定的概率分布HyperLogLog 通过维护多个寄存器来记录这些最大长度然后根据这些寄存器的值和一定的数学公式来估算集合中的不同元素数量特点以牺牲一定的准确性为代价换取了对内存的高效利用能够在有限的内存空间内处理大规模数据集HyperLogLog不存储数据只记录不重复数的个数HyperLogLog有误差在0.8125%基数统计的应用场景和案例基数统计场景1网站流量分析互联网公司中用于统计网站的独立访客数量为市场部门评估网站的用户覆盖范围和广告效果提供重要数据。例如像百度这样的大型搜索引擎网站每天有海量的访问请求。通过基数统计可以了解有多少不同的用户访问了网站而不需要记录每个用户的详细访问信息。使用 HyperLogLog 算法在内存占用较小的情况下就能快速估算出 UV/PV/ 注册IP数/ 每日访问IP数/统计在线人数统计网站注册IP数使用HyperLogLog可以高效地统计网站注册用户的独立IP数量为网站运营者提供有价值的数据支持。统计每日访问IP数通过对用户访问日志进行处理使用HyperLogLog可以快速统计出每日的独立访问IP数有助于分析网站流量和用户行为。统计页面实时UV PV数在实时监控系统中使用HyperLogLog可以估算出页面的实时访问用户数UV和页面访问量PV为网站运营者提供实时反馈。统计在线人数在实时在线人数统计系统中HyperLogLog可以用于估算当前在线用户的数量为系统性能优化和用户体验改进提供数据支持。APP活跃用户数统计一个APP的日活(日活跃用户数量)、月活数(月活跃用户数量)即每天或每月有多少不同的用户活跃常见名词解释UV(Unique Visitor)独立访客一般为客户端IP要去重PV(Page View)页面浏览量不用去重DAU(Daily Active User)日活跃用户量当天登录或者使用某个产品的用户数要去掉重复登录的用户多次登录只记录一次MAU(Monthly Active User)月活跃用户基数统计场景2数据库去重在数据库管理中用于统计一个表中某列的不同值的数量。例如在电商数据库中统计产品表中不同品牌的数量有助于了解产品的品牌多样性和市场分布。若数据量小通过使用哈希集合可以精确计算基数若数据量庞大HyperLogLog 则是一种更合适的近似计算方法技术实现要点精确计算的实现方法哈希集合实现使用哈希函数映射元素到存储位置处理哈希冲突链表法或开放寻址法维护元素数量计数器适用场景数据量较小百万级以下需要精确结果内存充足近似计算的实现方法HyperLogLog算法使用多个寄存器记录哈希值前导零的最大长度通过数学公式估算基数误差率约为0.8125%适用场景数据量巨大亿级以上可以接受一定误差内存受限环境性能对比特性精确计算HashSet近似计算HyperLogLog内存占用O(n)O(log log n)计算精度100%准确约99.2%准确误差率0%约0.8125%适用数据量小到中等大到极大查询速度O(1)O(1)总结基数统计是处理去重问题的核心统计方法根据数据规模和精度要求选择合适的实现方式小规模数据使用精确计算保证结果准确性大规模数据使用近似计算在有限内存下获得可接受的精度实时统计HyperLogLog提供了高效的实时基数统计能力业务指标UV、DAU、MAU等关键业务指标都依赖于基数统计技术