redis数据类型HyperLogLog的使用
最近遇到一个业务需求,要统计一张mysql大表每天/每周/每月的记录量(该表每天产生的记录量在好几百万)。当然有朋友会说,select count(1) from xxx 不就完事了吗?
确实,但是大表做count非常耗时,如果db服务器配置也不咋地,直接就跑跪了。
于是想到了redis里的HyperLogLog,这种数据类型一般很少用,但是计算count是它的强项,性能极快(具体原理可参考文末文章)
一、基本用法
1.1 向HyperLogLog中添加元数
pfadd key名 数据1 数据2 ...

如上图,可以用 "表名_天"做为key,然后把每行记录的主键Id扔进去,如果操作执行成功,会返回1
1.2 统计HyperLogLog中的基数(即:去除重复后的元素个数)
pfcount key名

可以看到,返回了数字6,自动将重复元素3 4 做了合并去重。
1.3 合并多个HyperLogLog
pfmerge 新key名 key1 key2 ...
假如我们已经有了 table_20200825 , table_20200826 这2个key,想统计它们的元素之和,就可以用pfmerge合并这2个HyperLogLog

注意:合并时,如果2个HyperLogLog中有重复元素,新Key会自动合并去重。
二、大表count思路
学习了HyperLogLog的用法,回到最开始的场景,怎么实时把大表的ID都扔到HyperLogLog里呢?
可以借助canal工具,订阅mysql的binlog,实时消费mq,扔到redis里。
链路:
mysql -> canal -> mq -> redis
优点:对业务系统0侵入性,也没有额外的性能开销。
不过,世界上并没有银弹,HyperLogLog也并非完美无缺,它的统计值是有一定误差的,并非1个不漏,对于计算日活/海量数据定性分析,这些是没问题的,但是如果用于统计具体金额之类的,就不建议使用了。
另外,对于已经添加进去的元素,没办法删除,没有类似pfdelete的命令。
参考文章:
https://www.jianshu.com/p/55defda6dcd2
https://mp.weixin.qq.com/s/AvPoG8ZZM8v9lKLyuSYnHQ
https://zhuanlan.zhihu.com/p/77289303
redis数据类型HyperLogLog的使用的更多相关文章
- 初识Redis的数据类型HyperLogLog
前提 未来一段时间开发的项目或者需求会大量使用到Redis,趁着这段时间业务并不太繁忙,抽点时间预习和复习Redis的相关内容.刚好看到博客下面的UV和PV统计,想到了最近看书里面提到的HyperLo ...
- Redis中 HyperLogLog数据类型使用总结
转载请注明出处: 目录 1. HyperLogLog 的原理 2.使用步骤 3.实现请求ip去重的浏览量使用示例 4.Jedis客户端使用 5.Redission使用依赖 6.HyperLogLog ...
- Redis数据类型和常用命令
Redis相较于其它的数据库虽然简单,但是要熟记所有命令的用法也并非易事.一个简单的技巧是通过要操作的数据类型来将这些命令进行结构化. 数据类型和对应命令 所有存储于redis中的数据都对应于一个键值 ...
- Redis数据类型和操作
<"Java技术员"成长手册>,包含框架.存储.搜索.优化.分布式等必备知识,都收集在GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎指导 Redis ...
- Redis数据类型简介(十分钟快速学习Redis)
如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...
- Redis数据类型:五大基本数据类型及三种特殊类型
String (字符串类型) String是redis最基本的类型,你可以理解成Memcached一模一样的类型,一个key对应一个value. String类型是二进制安全的,意思是redis的st ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
- redis数据类型及使用场景
Redis数据类型 String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mge ...
- Redis数据类型介绍
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- redis数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
随机推荐
- 【记录】Python3|Selenium 下载 PDF 不预览不弹窗(2024年)
版本: Chrome 124 Python 3.12 Selenium 4.19.0 版本与我有差异不要紧,只要别差异太大比如 Chrome 用 57 之前的版本了,就可以看本文. 如果你从前完全没使 ...
- Web前端入门第 45 问:CSS 变量 var() 轻松实现主题换肤功能
HELLO,这里是大熊的前端开发笔记. 曾经主题切换功能可以作为软件中亮眼的卖点存在,毕竟那时候要实现换肤可不容易,一套主题一套样式,这代码的重复率嗖嗖嗖的就涨上去了~~当然也可以借助 CSS 预编译 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 — PDF Kit
1.问题描述: 预览PDF文件,文档上所描述的loadDocument接口,可以返回文件的状态,并无法实现PDF的预览,是否有能预览PDF相关接口? 解决方案: 1.执行loadDocument进行加 ...
- 【网站推荐】推荐几个MCP(Model Context Protocol,模型上下文协议)的网站
MCP网站一:MCP 快速入门 介绍 MCP 快速入门.开发工具.核心架构等内容. https://mcp-docs.cn/introduction MCP网站二:GitHub 官方仓库 由MCP协议 ...
- Redundant Connection——LeetCode进阶路
原题链接https://leetcode.com/problems/redundant-connection/ 题目描述 In this problem, a tree is an undirecte ...
- GC面试重点:垃圾回收机制
你知道哪些垃圾回收算法?垃圾回收从理论上非常容易理解,具体的方法有以下几种: 1. 标记-清除:2. 标记-复制:3. 标记-整理:4. 分代回收. 如何判断一个对象是否应该被回收?这就是所谓的对象存 ...
- jupyter的使用 -- 快捷键
jupyter的使用 1.快捷键的使用 插入cell:a,b 删除cell:x 执行cell:shift+enter 切换cell的模式:m,y cell执行后,在cell的左侧双击就可以回到cell ...
- 【中文】【吴恩达课后编程作业】Course 2 - 改善深层神经网络 - 第三周作业
[中文][吴恩达课后编程作业]Course 2 - 改善深层神经网络 - 第三周作业 - TensorFlow入门 上一篇:[课程2 - 第三周测验]※※※※※ [回到目录]※※※※※下一篇:[课程3 ...
- 一个开源免费、功能丰富的 WPF 自定义控件资源库
前言 今天大姚给大家分享一个开源免费(MIT license).功能丰富的 WPF 自定义控件资源库:WPF-ControlBase. WPF 介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有 ...
- 在MySQL中悲观锁及乐观锁的应用
本文由 ChatMoney团队出品 在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段.MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题 ...