最近遇到一个业务需求,要统计一张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的使用的更多相关文章

  1. 初识Redis的数据类型HyperLogLog

    前提 未来一段时间开发的项目或者需求会大量使用到Redis,趁着这段时间业务并不太繁忙,抽点时间预习和复习Redis的相关内容.刚好看到博客下面的UV和PV统计,想到了最近看书里面提到的HyperLo ...

  2. Redis中 HyperLogLog数据类型使用总结

    转载请注明出处: 目录 1. HyperLogLog 的原理 2.使用步骤 3.实现请求ip去重的浏览量使用示例 4.Jedis客户端使用 5.Redission使用依赖 6.HyperLogLog ...

  3. Redis数据类型和常用命令

    Redis相较于其它的数据库虽然简单,但是要熟记所有命令的用法也并非易事.一个简单的技巧是通过要操作的数据类型来将这些命令进行结构化. 数据类型和对应命令 所有存储于redis中的数据都对应于一个键值 ...

  4. Redis数据类型和操作

    <"Java技术员"成长手册>,包含框架.存储.搜索.优化.分布式等必备知识,都收集在GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎指导 Redis ...

  5. Redis数据类型简介(十分钟快速学习Redis)

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  6. Redis数据类型:五大基本数据类型及三种特殊类型

    String (字符串类型) String是redis最基本的类型,你可以理解成Memcached一模一样的类型,一个key对应一个value. String类型是二进制安全的,意思是redis的st ...

  7. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  8. redis数据类型及使用场景

    Redis数据类型  String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令:  set,get,decr,incr,mge ...

  9. Redis数据类型介绍

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  10. redis数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

随机推荐

  1. 【记录】Python3|Selenium 下载 PDF 不预览不弹窗(2024年)

    版本: Chrome 124 Python 3.12 Selenium 4.19.0 版本与我有差异不要紧,只要别差异太大比如 Chrome 用 57 之前的版本了,就可以看本文. 如果你从前完全没使 ...

  2. Web前端入门第 45 问:CSS 变量 var() 轻松实现主题换肤功能

    HELLO,这里是大熊的前端开发笔记. 曾经主题切换功能可以作为软件中亮眼的卖点存在,毕竟那时候要实现换肤可不容易,一套主题一套样式,这代码的重复率嗖嗖嗖的就涨上去了~~当然也可以借助 CSS 预编译 ...

  3. 【FAQ】HarmonyOS SDK 闭源开放能力 — PDF Kit

    1.问题描述: 预览PDF文件,文档上所描述的loadDocument接口,可以返回文件的状态,并无法实现PDF的预览,是否有能预览PDF相关接口? 解决方案: 1.执行loadDocument进行加 ...

  4. 【网站推荐】推荐几个MCP(Model Context Protocol,模型上下文协议)的网站

    MCP网站一:MCP 快速入门 介绍 MCP 快速入门.开发工具.核心架构等内容. https://mcp-docs.cn/introduction MCP网站二:GitHub 官方仓库 由MCP协议 ...

  5. Redundant Connection——LeetCode进阶路

    原题链接https://leetcode.com/problems/redundant-connection/ 题目描述 In this problem, a tree is an undirecte ...

  6. GC面试重点:垃圾回收机制

    你知道哪些垃圾回收算法?垃圾回收从理论上非常容易理解,具体的方法有以下几种: 1. 标记-清除:2. 标记-复制:3. 标记-整理:4. 分代回收. 如何判断一个对象是否应该被回收?这就是所谓的对象存 ...

  7. jupyter的使用 -- 快捷键

    jupyter的使用 1.快捷键的使用 插入cell:a,b 删除cell:x 执行cell:shift+enter 切换cell的模式:m,y cell执行后,在cell的左侧双击就可以回到cell ...

  8. 【中文】【吴恩达课后编程作业】Course 2 - 改善深层神经网络 - 第三周作业

    [中文][吴恩达课后编程作业]Course 2 - 改善深层神经网络 - 第三周作业 - TensorFlow入门 上一篇:[课程2 - 第三周测验]※※※※※ [回到目录]※※※※※下一篇:[课程3 ...

  9. 一个开源免费、功能丰富的 WPF 自定义控件资源库

    前言 今天大姚给大家分享一个开源免费(MIT license).功能丰富的 WPF 自定义控件资源库:WPF-ControlBase. WPF 介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有 ...

  10. 在MySQL中悲观锁及乐观锁的应用

    本文由 ChatMoney团队出品 在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段.MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题 ...