获取两个数据的交集_Redis学习笔记统计该如何选择数据类型
在业务场景中经常需要统计,如某直播累计观看人数、独立访客人数、历史总观看人数等等,再比如要统计某学生某月的签到情况等,遇到统计的情况,就需要思考如何合理地选择 Redis 数据类型,这篇文章学习一下各种统计的业务场景和分类,这样就能很容易的对应各种统计需求了。
1.笔记图
2.Redis 聚合统计
2.1 场景
交集统计:统计多个集合的共有元素
差集统计:统计一个集合相比于另一个集合有车别的元素
并集统计:统计多个集合的所有元素
2.2 举例
记录所有登录过的用户ID:
记录某天所有登录过的用户ID:
记录某天新增的用户ID:如记录 1 月 4 日和 1 月 5 日所有用户 ID,求它们差集合就是新增用户,求差集命令:
SDIFFSTORE user_new user_id_20200804 user_id_20200803
Tips:表示将 user_id_20200804 集合和 user_id 集合求差集,并保存至 user_new 集合中,可表示 20200804 这个日期的新增用户数。
记录某天留存下的用户ID:如记录 1 月 4 日和 1 月 5 日所有用户 ID,然后求它们交集就是当日留存用户,求交集命令:
SINTERSTORE user_new user_id_20200804 user_id_20200803
Tips:表示将 user_id_20200804 集合和 user_id 集合求交集,并保存至 user_new 集合中,可表示 20200804 留存的用户数。
2.3 优化建议
Set 的差集、并集和交集的计算复杂度较高,直接执行这些计算,会导致 Redis 实例阻塞
可以从主从集群中选择一个从库,让它专门负责聚合计算,或者是把数据读取到客户端,在客户端来完成聚合统计
3.排序统计举例
获取最新评论列表:按评论时间的先后给每条评论设置一个权重值,然后再把评论保存到 Sorted Set 中
ZRANGEBYSCORE comments N-9 N
4.二值状态
统计 ID 3000 的用户在 2020 年 8 月份的签到情况:
统计 ID 3000 的用户在 2020 年 8 月份的签到情况
SETBIT uid_sign_3000_202008 2 1
检查该用户 8 月 3 日是否签到
GETBIT uid_sign_3000_202008 2
统计该用户在 8 月份的签到次数
BITCOUNT uid_sign_3000_202008
如果记录了 1 亿个用户 10 天的签到情况,你有办法统计出这 10 天连续签到的用户总数吗?:
把每天的日期作为 key,每个 key 对应一个 1 亿位的 Bitmap,每一个 bit 对应一个用户当天的签到情况
对 10 个 Bitmap 做 与 操作,得到的结果也是一个 Bitmap
BITCOUNT 统计下 Bitmap 中的 1 的个数,这就是连续签到 10 天的用户总数了
5.基数统计举例
统计某个网页一天的独立访客(UV):HyperLogLog
PFCOUNT uv_20180808
PFADD uv_20180808 user1 user2 user3 user4 user5
统计结果是有一定误差的,标准误算率是 0.81%,但是它非常节省空间
6.各个数据类型统计
关联文章:Redis学习笔记-String数据类型及其节省空间优化Redis学习笔记-切片集群Redis ClusterRedis学习笔记-哨兵机制&哨兵集群建立过程Redis学习笔记-主从库如何实现数据同步一致
Redis学习笔记-高性能IO模型&Redis6.0多线程Redis学习笔记-哈希桶和底层数据结构Redis学习笔记-数据类型和操作(动手试试)
获取两个数据的交集_Redis学习笔记统计该如何选择数据类型相关推荐
- 获取两个数据的交集_MySQL交集和差集的实现方法
在MySQL中,只支持Union(并集)集合运算,而对于交集Intersect和差集Except并不支持.那么如何才能在MySQL中实现交集和差集呢? 一般在MySQL中,我们可以通过in和not i ...
- oracle两表交集查询,Oracle对两个数据表交集的查询
正在看的ORACLE教程是:Oracle对两个数据表交集的查询. Oracle关系型数据库管理系统是世界上流行的关系数据库,它是一个极其强大.灵活和复杂的系统,据说,在使用oracle时应有这样的思想 ...
- python两个list取交集_使用 Python 获取两个列表的交集、并集、差集的常用方法 | Jin''''s Blog...
在数据处理中经常需要使用 Python 来获取两个列表的交集,并集和差集.在 Python 中实现的方法有很多,我平时只使用一两种我所熟悉的,但效率不一定最高,也不一定最优美,所以这次想把常用的方法都 ...
- 【mysql】mysql获取两个集合的交集/差集/并集
mysql的常见场景,获取两个数据集的交集和差集 步骤 两个集合的结构要一致,对应的字段数,字段类型 将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 将上面的所有集 GROU ...
- python segy格式地震数据读写包segyio学习笔记(二)
python segy格式地震数据读写包segyio学习笔记(二) 最近大致搞明白了segyio读取叠后和叠前segy数据的方法,以及内部存储结构,以两段代码为例: 叠后数据读取.这是一个从给定时窗内 ...
- 用matlab代码进行数据探索、数据清洗学习笔记
目录 1.说明 2.作文目的 3.数据质量分析3个判别方法 3-1.异常值判别 3-1-1.箱型图法 3-1-2.3σ准(原)则(拉依达准则) 3-2.缺失值判别 3-3.不一致的值判别 4.数据清洗 ...
- 在大量数据迁移期间oracle学习笔记
在数据迁移期间oracle学习笔记 0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态 需求分析: 1.根据上述 ...
- 《Go语言圣经》学习笔记 第四章 复合数据类型
<Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...
- 《Go语言圣经》学习笔记 第三章 基础数据类型
<Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...
最新文章
- spring MVC cors跨域实现源码解析
- 解决方法|ESP8266环境搭建出现 usrbinenv bashr :没有那个文件或目录
- canny边缘检测算法 opencv_OpenCV-Python Canny边缘检测 | 十九
- Python 自动生成环境依赖包 requirements
- xshell6左侧导航显示_【iOS12人机交互指南】7.1-导航栏
- 字典推导式_Python基础-推导式
- 七种武器——.NET工程师求职面试必杀技(转)
- 可对Python运行原理进行可视化分析的工具
- 使用Vibrator控制手机振动
- 解决办法:C++编译中[-Wreorder]
- 【深度相机系列二】深度相机原理揭秘--飞行时间(TOF)
- 安卓Intent 详解
- MAC查看软件安装路径
- 思科三层交换机开启ipv6路由功能_网络工程实战之三层交换机配置IPv6 DNS 示例...
- 文件搜索工具(Python实现)
- Python热门单元测试框架对比:pytest和unittest还傻傻分不清楚?
- 作为有经验的程序员如果不懂Lambda表达式就说不过去了吧
- 格雷希尔GripSeal外螺纹快速连接器的优点和注意事项
- C# 飞行棋小游戏 (控制台应用)
- ios与mac的时间问题,修改闹钟时间,24小时制