7 hyperLogLog

介绍HyperLogLog算法在Redis中的应用,用于高效估算大量数据的基数,特别适用于统计注册IP数、每日访问IP数等场景。

 

HyperLogLog

HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:

• 基数:集合中不同元素的数量。比如 {'apple', 'banana', 'cherry', 'banana', 'apple'} 的基数就是 3 。

• 估算值:算法给出的基数并不是精确的,可能会比 实际稍微多一些或者稍微少一些,但会控制在合 理的范围之内。
HyperLogLog 的优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

 

相关指令:

1.PFADD key element [element...]

       将任意数量的元素添加到指定的 HyperLogLog 里面。
       这个命令可能会对 HyperLogLog 进行修改,以便反映新的基数估算 值,如果 HyperLogLog 的基数估算 值在命令执行之后出现了变化, 那么命令返回 1 , 否则返回 0 。
     命令的复杂度为 O(N) ,N 为被添加元素的数量。

2.  PFCOUNT key [key ...]

       当只给定一个 HyperLogLog 时,命令返回给定 HyperLogLog 的基数估算值。
      当给定多个 HyperLogLog 时,命令会先对给定的 HyperLogLog 进行并集计算,得出一个合并后的 HyperLogLog ,然后返回这个合并 HyperLogLog 的基数估算值作为命令的结果(合并得出的 HyperLogLog 不会被储存,使用之后就会被删掉)。
     当命令作用于单个 HyperLogLog 时, 复杂度为 O(1) , 并且具有非常低的平均常数 时间。 当命令作用于多个 HyperLogLog 时, 复杂度为 O(N) ,并且常数时间也比处理单个 HyperLogLog 时要 大得多。

 

3.  PFMERGE destkey sourcekey [sourcekey ...]

        将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的。
       命令的复杂度为 O(N) , 其中 N 为被合并的 HyperLogLog 数量, 不过这个命令的常数复杂度比较高。

 

应用场景
    基数不大,数据量不大就用不上,会有点大材小用浪费空间
    有局限性,就是只能统计基数数量,而没办法去知道具体的内容是什么
    和bitmap相比,属于两种特定统计情况,简单来说,HyperLogLog 去重比 bitmap 方便很多
    一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃,hyperloglog计数

一般使用:

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

 

 

基于粒子群优化算法的p-Hub选址优化(Matlab代码实现)内容概要:本文介绍了基于粒子群优化算法(PSO)的p-Hub选址优化问题的研究与实现,重点利用Matlab进行算法编程和仿真。p-Hub选址是物流与交通网络中的关键问题,旨在通过确定最优的枢纽节点位置和非枢纽节点的分配方式,最小化网络总成本。文章详细阐述了粒子群算法的基本原理及其在解决组合优化问题中的适应性改进,结合p-Hub中转网络的特点构建数学模型,并通过Matlab代码实现算法流程,包括初始化、适应度计算、粒子更新与收敛判断等环节。同时可能涉及对算法参数设置、收敛性能及不同规模案例的仿真结果分析,以验证方法的有效性和鲁棒性。; 适合人群:具备一定Matlab编程基础和优化算法理论知识的高校研究生、科研人员及从事物流网络规划、交通系统设计等相关领域的工程技术人员。; 使用场景及目标:①解决物流、航空、通信等网络中的枢纽选址与路径优化问题;②学习并掌握粒子群算法在复杂组合优化问题中的建模与实现方法;③为相关科研项目或实际工程应用提供算法支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐段理解算法实现逻辑,重点关注目标函数建模、粒子编码方式及约束处理策略,并尝试调整参数或拓展模型以加深对算法性能的理解。
### HyperLogLog 与 Bitmap 的特性对比 #### 特性概述 HyperLogLog 是一种概率算法,专门设计用于估计集合的基数(即唯一元素的数量)。这种数据结构通过牺牲一定的精度来大幅减少内存消耗。对于大规模数据集而言,HyperLogLog 提供了一种高效的解决方案,在仅需少量内存的情况下完成近似去重计数的任务[^1]。 ```python import redis r = redis.Redis() # 添加元素到 HyperLogLog 结构中 r.pfadd('visitors', 'user_001') r.pfadd('visitors', 'user_002') # 获取估计的独特访客数量 unique_visits = r.pfcount('visitors') print(f"Estimated unique visitors: {unique_visits}") ``` 另一方面,Bitmap 则是一种基于位图的数据表示方法,它利用每一位(bit) 来标记某个特定事件的发生与否。由于每位只占用一位二进制空间(0 或者 1),所以当需要追踪大量布尔状态时非常节省资源。此外,还可以通过对多位进行逻辑运算来进行复杂查询操作[^2]。 ```python import redis r = redis.Redis() # 设置某一天用户的签到状态 (假设第7天) r.setbit('sign_in_status:user_001', 6, 1) # 查询该用户是否已经签到了第七天 is_signed_in_day_seven = bool(r.getbit('sign_in_status:user_001', 6)) print(f"User signed in on day seven? {'Yes' if is_signed_in_day_seven else 'No'}") ``` #### 应用场景分析 - **HyperLogLog** - 当面对海量数据流并希望快速获取其中不同实体数目而无需精确值时; - 对于实时数据分析平台来说非常适合用来做UV(PV)统计等业务指标监控; - **Bitmap** - 实现高效的时间序列记录功能,比如每日活跃用户(DAU)/每月活跃用户(MAU) 统计; - 进行权限管理或会员等级体系的设计,因为可以通过简单的按位运算实现复杂的组合判断; 综上所述,虽然两者都能有效降低传统集合类型的内存开销,但在具体应用场合各有侧重:如果更关注的是“有多少不同的东西”,那么应该优先考虑使用 HyperLogLog;而对于那些涉及频繁读写以及简单真伪判定的需求,则更适合采用 Bitmap 方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值