当前位置:

首页 > 编程开发 > Redis的HyperLogLog算法怎么用

Redis的HyperLogLog算法怎么用

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-22
正版软件 Windows macOS软件 Linux 数据库管理工具

今天是周五,你正开心的摸鱼,产品经理通过邮件给你发了一个需求文档。需求大概是:公司要统计网站每天的访客IP,而且这个统计是一个长期的行为,短则数月、长则几年。你看完需求就觉得这soeasy啊,使用Redis的集合类型可以轻松实现这个功能:每天生成一个集合类型的键,使用SADD存储每天的访客IP,使用SCARD命令就可以轻松得到每天访客IP的数量。你很快就敲完了代码并通过测试,这个功能就上线了。上线后运行一段时间发现Redis所在服务器开始告警,原因是某些键的内存占用过大,你看了一下发现这些键都是存储访客I

本文目录

    Redis的HyperLogLog算法怎么用

    今天是周五,你正开心的摸鱼,产品经理通过邮件给你发了一个需求文档。需求大概是:公司要统计网站每天的访客 IP,而且这个统计是一个长期的行为,短则数月、长则几年。

    你看完需求就觉得这 so easy 啊,使用 Redis 的集合类型可以轻松实现这个功能:每天生成一个集合类型的键,使用 SADD 存储每天的访客 IP,使用 SCARD 命令就可以轻松得到每天访客 IP 的数量。

    你很快就敲完了代码并通过测试,这个功能就上线了。上线后运行一段时间发现 Redis 所在服务器开始告警,原因是某些键的内存占用过大,你看了一下发现这些键都是存储访客 IP 的集合键。你这才拍了一下脑袋,知道自己给自己挖了一个大坑。

    假设存储一个 IPv4 格式的 IP 地址最多需要 15 个字节,网站每天最多有 100 万个访客访问网站。这些集合键一个月就将使用 0.45 GB 的内存,一年将占用 5.4 GB 的内存,这还只是估算了 IPv4 格式的情况下,若是 IPv6 格式将占用更多的内存。SADD 和 SCARD 的时间复杂度虽然都是 O(1),但是它们对内存的消耗是无法接受的。

    你在 Redis 的官方网站翻了翻,发现 Redis 还提供了一种数据类型 HyperLogLog,它既可以实现产品的需求还占用更少的内存。

    HyperLogLog 算法

    HyperLogLog 是一个专门为了计算集合的基数而创建的概率算法,它可以计算出一个给定集合的近似基数。

    近似基数并非集合的实际基数,它可能会比实际的基数小一点或者大一点,但是估算基数和实际基数之间的误差会处于一个合理的范围之内,对于那些不要求十分精确的统计就可以使用 HyperLogLog 算法。

    HyperLogLog 的优点在于它计算近似基数所需的内存并不会因为集合的大小而改变,无论集合包含的元素有多少个,HyperLogLog 进行计算所需的内存总是固定的,并且是非常少的。

    Redis 的每个 HyperLogLog 类型只需要使用 12KB 内存空间,就可以对接近:264 个元素进行计数,而算法的标准误差仅为 0.81%。

    如果使用 HyperLogLog 类型实现上述功能,每天有 100 万个访客的情况下,1 个月也仅仅占用 360KB 的内存。

    PFADD

    通过 PFADD 命令可以对给定的一个或多个集合元素进行计数。

    PFADD key element [element...]

    根据给定的元素是否已经进行过计数,PFADD 命令可能返回 0,也可能返回 1:

    • 如果给定的所有元素都已经进行过计数,那么 PFADD 命令将返回 0,表示 HyperLogLog 计算出的近似基数没有发生变化。

    • 如果给定的元素中出现了至少一个之前没有进行过计数的元素,导致 HyperLogLog 计算出的近似基数发生了变化,那么 PFADD 命令将返回 1。

    例如:

    redis> PFADD letters a b c -- 第一次添加
    (integer) 1
    redis> PFADD letters a     -- 第二次添加
    (integer) 0

    如果在调用该命令时仅指定 key 而不指定元素也是可以的,如果 key 存在,则不会有任何操作,如果不存在,则会创建一个数据结构(返回 1)。

    PFCOUNT

    通过 PFCOUNT 命令可以获取 HyperLogLog 为集合计算出的近似基数。若给定的 key 不存在将返回 0。

    PFCOUNT key [key...]

    例如:

    redis> PFCOUNT letters
    (integer) 3

    当向 PFCOUNT 传入多个 HyperLogLog 时,PFCOUNT 命令将先对所有的 HyperLogLog 求并集,然后返回近似基数。

    redis> PFADD letters1 a b c
    (integer) 1
    redis> PFADD letters2 c d e
    (integer) 1
    redis> PFCOUNT letters1 letters2
    (integer) 5

    PFMERGE

    PFMERGE 命令可以对多个 HyperLogLog 执行并集计算,然后把计算得出的并集 HyperLogLog 保存到指定的键中。

    PFMERGE destKey sourceKey [sourceKey...]

    如果指定的键已经存在,PFMERGE 命令将覆盖已有的键。

    redis> PFADD letters1 a b c
    (integer) 1
    redis> PFADD letters2 c d e
    (integer) 1
    redis> PFMERGE res letters1 letters2
    OK
    redis> PFCOUNT res
    (integer) 5

    可以看到 PFMERGE 和 PFCOUNT 命令十分相似,实际上 PFCOUNT 命令在计算多个 HyperLogLog 的近似基数时会执行以下操作:

    • 在内部调用 PFMERGE 命令,计算所有给定 HyperLogLog 的并集,并将这个并集存储到一个临时的 HyperLogLog 中。

    • 对临时 HyperLogLog 执行 PFCOUNT 命令,得到它的近似基数。

    • 删除临时 HyperLogLog。

    • 返回得到的近似基数。

    当程序需要对多个 HyperLogLog 调用 PFCOUNT 命令,并且这个调用可能会重复执行多次时,可以考虑把这一调用替换成相应的 PFMERGE 命令调用:通过把并集的计算结果存储到指定的 HyperLogLog 中而不是每次都重新计算并集,程序可以最大程度地减少不必要的并集计算。

    业务场景

    HyperLogLog 的特性十分适合:计数(月度、年度统计)、去重(垃圾短信检测)等场景。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    php72w redis,docker php7安装php-redis
    php72w redis,docker php7安装php-redis

    在Docker环境下为PHP安装Redis扩展:手动编译需下载源码、安装phpize、配置编译并安装,生成redis.so并在php.d目录新建redis.ini加载,重启PHP-FPM;也可直接yum安装php72w-pecl-redis,免手动编译。

    php 如何配置 redis,php 如何设置redis
    php 如何配置 redis,php 如何设置redis

    配置PHP的Redis扩展:先安装Redis服务,从GitHub下载phpredis源码,用phpize编译安装,修改php.ini添加extension=redis.so,重启php-fpm或Apache,通过phpinfo验证并连接Redis。

    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】
    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】

    C++结构体无法直接序列化为RESP协议,需手动将字段映射为*N数组嵌套$lenbulkstring形式。整数需转换为字符串并加:前缀,空字符串用$0\r\n,null用$-1\r\n。长度计算需精确到字节数,特别注意二进制安全,同时确保字段顺序与结构体定义一致。

    如何在Golang架构中部署Redict作为高能数据临时存储中转站
    如何在Golang架构中部署Redict作为高能数据临时存储中转站

    Redis作为跨服务临时状态枢纽,需按消息队列、缓存和原子状态三重角色设计。选型用List实现任务分发及延迟重试,Stream用于事件广播与位点回溯。go-redis/v8需配置MinIdleConns、MaxRetries及超时。数据写入应JSON序列化并带type标签、设合理TTL、将关键字段提至顶层。消费通过原子GET+DEL或processedkey

    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制
    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制

    在高并发秒杀场景下,利用Redis的减库存原子操作预扣减库存拦截超卖请求,再通过数据库乐观锁(版本号与库存校验)确保最终一致性,异常时回滚Redis库存并借助Lua脚本保证原子性,从而有效防止库存超卖。

    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑
    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑

    在Go中使用go-redis执行Lua脚本可借助原子性解决竞态问题,通过redis.Script封装脚本并自动处理SHA1缓存与重试。需注意KEYS必须为非空切片且所有键在Cluster模式下落在同一slot,ARGV以字符串传入并由tonumber转换。返回值需先检查错误再调用Val(),避免panic。

    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】
    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】

    先看一个典型场景:电商秒杀、库存扣减、定时任务重复调度——这些并发冲突在 TP6 应用里屡见不鲜。用 Redis 的 SETNX 做互斥锁,确实是轻量又直接的方案,但“能用”和“稳妥”之间,隔着三层硬功夫:原子加锁、身份校验、合理超时。这三条,差一条就翻车。 很多人第一次上手,直接写 SETNX 加

    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】
    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】

    高并发抢购中,Redis的DECR原子操作可安全扣库存;配合think-queue异步削峰,接口仅扣库存和推消息;分布式锁需用SETNXEX加唯一标识,释放时用Lua脚本校验;成功资格后须以数据库事务双写为准,失败时补回Redis库存。

    Golang 实现基于 Redis 的延时任务队列
    Golang 实现基于 Redis 的延时任务队列

    基于Redis的ZSET实现延时队列需解决并发重复消费、失败重试混乱、精度不足及内存爆炸等问题。通过Lua脚本保证取删原子性,使用毫秒级时间戳,对临时错误采用指数退避重试,永久错误记入独立哈希表,并限制最大延迟、定期清理过期任务、使用紧凑序列化格式。

    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】
    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】

    操作 Redis 的时候,改个 Key 的过期时间其实是个高频场景。特别是做运维排查或者临时调试那会儿,谁也不想反复切命令行窗口、背那些命令参数。好在 RedisInsight 这个图形工具把这事儿做得很顺手——三种方式任选,总有一种合你胃口。 在动手前,先确认一下 Key 当前的 TTL 状态是个

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?