HyperLogLog(关于基数统计)

2023-11-02

写在前面

今天在复习Redis的一种在Redis 2.8.9 版本更新的结构的时候,知道了这个数据结构是基于一种优秀的算法HyperLogLog,基数统计算法(简单来说就是统计集合中的元素数量,但是对比set有了很大的优化),就去了解了一下这种算法的精妙之处。

HyperLogLog

这种数据结构在Redis这种NoSQL型数据库中可以非常省内存的去统计各种计数,比如注册 IP 数、每日访问 IP 数、页面实时UV、在线用户数,共同好友数等。这个是应用场景。

127.0.0.1:6379[1]> PFADD k1 a b c d 1 2 3 4 1 2 3 4 5
(integer) 1
127.0.0.1:6379[1]> PFCOUNT k1
(integer) 9
127.0.0.1:6379[1]> PFADD k2 a b c d 1 2 3 
(integer) 1
127.0.0.1:6379[1]> PFMERGE k1 k2
OK
127.0.0.1:6379[1]> PFCOUNT k1
(integer) 9
127.0.0.1:6379[1]> PFADD k2 a b c 5 6 1 2 3 4
(integer) 1
127.0.0.1:6379[1]> PFCOUNT k2
(integer) 10
127.0.0.1:6379[1]> keys *
1) "k2"
2) "k1"
127.0.0.1:6379[1]> PFCOUNT k2
(integer) 10
127.0.0.1:6379[1]> PFCOUNT k1
(integer) 9
127.0.0.1:6379[1]> PFMERGE k1 k2 
OK
127.0.0.1:6379[1]> PFCOUNT k1
(integer) 10

从上面的示例可以看出,有三个操作:PFADD、PFCOUNT、PFMERGE。

优点

1、使用少量内存就可以统计大量的数据,比如在Redis 中一个键为12K,就可以统计2^64的数据量。

2、统计存在一定的误差,误差率整体较低,标准误差为 0.81%(但是对于一些有一定容错率的业务场景,如IP统计、在线用户数等,这种误差是可以忽略不计的);

3、误差可以被设置辅助计算因子进行降低。

原理:来自于一篇论文http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf

参考

关于基数统计 - 知乎

Redis入门 - 数据类型:3种特殊类型详解 | Java 全栈知识体系

11. 优秀的基数统计算法--HyperLogLog - 古明地盆 - 博客园

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HyperLogLog(关于基数统计) 的相关文章

  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 如何在 Spring 属性中进行算术运算?

  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例

随机推荐

  • FreeRTOS学习笔记—任务创建和删除

    文章目录 一 任务创建和删除API函数 1 1 xTaskCreate 函数 1 2 xTaskCreateStatic 函数 1 3 vTaskDelete 函数 二 任务创建和删除 动态方法 2 1 任务要求 2 2 程序设计 2 2
  • 关于Collection下的removeAll方法抛出UnsupportedOperationException分析

    起因 这周在开发的过程遇到了以下这个错误 之前一直规范运用Collection的接口 所以这个异常比较少见 所以我就纳闷了 做个一个实验 package src import com google common collect Sets i
  • 《小家:越住越大2》

    第一章 餐厅如何避免杂乱 一般家庭的餐桌物品占用餐桌桌面面积普遍较高 显得餐桌杂乱 可以采用餐边柜与餐桌零距离接触方式方便杂物摆放 也可以采用移动是多层收纳车 如何避免孤单在厨房做饭 厨房与餐厅采用玻璃吊轨门连接 可以使用卡座代替普通餐椅
  • 12,verilog移位操作

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 Verilog中的移位操作有两类 逻辑移位和算术移位 逻辑右移 gt gt 1个操作数向右移位 产生的空位用0填充
  • 毕业设计-基于深度学习的病理图像细胞核分割

    目录 前言 课题背景和意义 实现技术思路 一 相关技术介绍 二 基于双通路解码的病理图像细胞核分割 三 基于无锚检测的病理图像细胞核分割 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学
  • 函数递归

    函数递归 1 递归是什么 2 递归的限制条件 3 递归举例 4 递归与迭代 1 递归是什么 递归是指函数可以调用自身来解决问题的一种编程技巧 在C语言中 递归是通过函数调用自己来实现的 使用递归可以使某些问题更容易理解和处理 例如 计算一个
  • nginx服务器access_log日志详解

    前言 nginx的log日志分为 access log 和 error log 其中access log 记录了哪些用户 哪些页面以及用户浏览器 ip和其他的访问信息 error log 则是记录服务器错误日志 log format 日志格
  • 服务器上部署前端Vue项目代码

    服务器上部署前端Vue项目代码 本人自己感觉部署前端代码比部署后端难 主要是我在部署的过程中遇到了各种报错 写这篇文章主要是记录一下自己艰难的踩坑过程 最终部署成功 前端框架使用的是Vue3 服务器系统是CentOS7 部署的整个过程主要分
  • SpringBoot各个版本使用Redis之间的区别

    今天在springboot中使用数据库 springboot版本为2 0 2 RELEASE 通过pom引入jar包 配置文件application properties中的redis配置文件报错 提示例如deprecated config
  • 阿里云 MongoDB 的连接使用规范

    阿里云 MongoDB 的连接使用规范 概述 我们在阿里云上的 MongoDB 有两种 副本集 主 被两个节点 分片集 集群 在多个业务同时连接 MongoDB 使用时 最重要的连接数问题 一旦超过最大值即影响其它业务的使用 所以必须要规范
  • Mysql 开源数据源笔记

    DBCP C3P0数据源 tomcat内置的数据源DBCP DBCP 方式1 BasicDataSource source new BasicDataSource source setDriverClassName com mysql jd
  • allegro 遇到的问题汇总 避免忘记

    目录 目录 1 已经布板后如何更新封装 2 如何批量放置VIA 3 如何替换某个过孔 4 OrCAD跟Allegro交互设置 5 在制作封装时 如何修改封装引脚的PIN Number 6 ORCAD画原理图时 off page connec
  • Linux关机命令详解

    在linux下一些常用的关机 重启命令有shutdown halt reboot 及init 它们都可以达到重启系统的目的 但每个命令的内部工作过程是不同的 Linux centos重启命令 1 reboot 2 shutdown r no
  • 表格与表单的嵌套关系

    表格与表单的嵌套关系 想要用表格与表单做一个注册界面 却对这两个元素的嵌套关系挡住的脚步 到底是表格里面放置表单呢 还是表单里面放置表格呢 没关系 小马哥带你答疑解惑 1 首先我们可以创建一个空表单 在这个表单里面不用放任何东西 2 然后我
  • selenium自动化环境搭建(Windows)

    一 selenium介绍 selenium主要用于web应用程序的自动化测试 还支持所有基于web的管理任务自动化 selenium经历了2个版本 selenium1 0和selenium2 0 selenium不是一个单独的工具 而是由一
  • 如何对Docker容器进行健康检查

    如何对 Docker 容器进行健康检查 熟悉使用过kubernetes的人应该知道 kubernetes支持对pod进行健康检查的功能 这对生产业务来说其实是非常有用处的 能快速发现服务不可用 并进行快速重启恢复 其实不使用kubernet
  • 局域网设备查找和发现,局域网软件在线更新,Qt udp组播

    使用udp组播原因 想要实现查找局域网自己的设备 但是不知道存在设备的ip 局域网软件在线更新 不想固定服务器的ip地址 因为是开发人员电脑 ip可能随时在变化 比较了广播 组播的优缺点 最终选择组播 组播优点 组播技术的初衷是在IP网络中
  • C++14新特性

    C 14 维基百科 C 14是C 的现行标准的非正式名称 正式名称为 International Standard ISO IEC 14882 2014 E Programming Language C C 14旨在作为C 11的一个小扩展
  • oracle的备份与恢复(一)

    author skate time 2010 09 06 oracle的备份与恢复 基于我个人的理解把恢复分为来两大类 1 基于备份的恢复 这种基于备份饿恢复是指通过备份文件 redo archivelog等来实现备份 2 没有备份的恢复
  • HyperLogLog(关于基数统计)

    写在前面 今天在复习Redis的一种在Redis 2 8 9 版本更新的结构的时候 知道了这个数据结构是基于一种优秀的算法HyperLogLog 基数统计算法 简单来说就是统计集合中的元素数量 但是对比set有了很大的优化 就去了解了一下这