redis简单使用HyperLogLog
一 HyperLogLog 介绍
- Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
- 在 Redis 中,HyperLogLog 是它的一种高级数据结构, 其功能结构类似于Set;
- HyperLogLog 经常使用于系统数据的不精确去重,标准误差为0.81%;
- 每个 HyperLogLog 键只需要12 KB 内存,就可以统计 2^64 个不同的元素;
- HyperLogLog 提供了两个指令用于计数统计,pfadd 为 添加数据;pfcount 为统计数据个数;
pfadd 指令来源于 Philippe Flajolet 发明了 HyperLogLog 这种数据结构,所以pf就是指其姓名的缩写;我们之前说过 HyperLogLog 这种数据结构能起到不精确确的去重效果,但必须是亿级流量的数据以上,否则就是浪费空间,因为每个键需要占据12kb的存储空间;
使用示例如下
127.0.0.1:6379> pfadd abin zk1
(integer) 1
127.0.0.1:6379> pfadd abin zk2
(integer) 1
127.0.0.1:6379> pfcount abin
(integer) 2
127.0.0.1:6379> pfadd abin zk3
(integer) 1
127.0.0.1:6379> pfcount abin
(integer) 3
127.0.0.1:6379>
HyperLogLog 还提供了 pfmerge 指令用于合并key,的到的结果是去重后的并集;
二 使用场景
- 统计注册 IP 数
- 统计每日访问 IP 数
- 统计页面实时 UV 数
- 统计在线用户数
- 统计用户每天搜索不同词条的个数
三 java实现
java实现非常简单,使用jedis方式实现代码如下;使用 pfadd指令 添加 1w条数据,最终计算的结构是 10055 条; 多了 55条, 可见统计是存在一些误差,但在大数据情况下一些误差是完全更够接收;
@Test
public void testHyperLogLog(){
// 插入1W条数据
Jedis jedis = jedisUtil.getJedis();
for (int i=0; i < 10000; i++){
jedis.pfadd("abin","zk"+i);
}
long abinCount = jedis.pfcount("abin");
//10055
System.out.println(abinCount);
jedis.close();
}
四 HyperLogLog 原理
HyperLogLog 原理实现非常复杂,但使用方式非常简单;我对这类算法的兴趣也不是很高,有兴趣的可以参考如下文章进行学习
https://juejin.im/post/6844903785744056333
https://zhuanlan.zhihu.com/p/58519480
五 思考
HyperLogLog 与 布隆过滤器都起到了去重效果,它们之间有什么区别?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix