关注爱因诗贤每天进步一点点导读

在业务场景中经常需要统计,如某直播累计观看人数、独立访客人数、历史总观看人数等等,再比如要统计某学生某月的签到情况等,遇到统计的情况,就需要思考如何合理地选择 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 
    • 统计该用户在 月份的签到次数

      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学习笔记统计该如何选择数据类型相关推荐

  1. 获取两个数据的交集_MySQL交集和差集的实现方法

    在MySQL中,只支持Union(并集)集合运算,而对于交集Intersect和差集Except并不支持.那么如何才能在MySQL中实现交集和差集呢? 一般在MySQL中,我们可以通过in和not i ...

  2. oracle两表交集查询,Oracle对两个数据表交集的查询

    正在看的ORACLE教程是:Oracle对两个数据表交集的查询. Oracle关系型数据库管理系统是世界上流行的关系数据库,它是一个极其强大.灵活和复杂的系统,据说,在使用oracle时应有这样的思想 ...

  3. python两个list取交集_使用 Python 获取两个列表的交集、并集、差集的常用方法 | Jin''''s Blog...

    在数据处理中经常需要使用 Python 来获取两个列表的交集,并集和差集.在 Python 中实现的方法有很多,我平时只使用一两种我所熟悉的,但效率不一定最高,也不一定最优美,所以这次想把常用的方法都 ...

  4. 【mysql】mysql获取两个集合的交集/差集/并集

    mysql的常见场景,获取两个数据集的交集和差集 步骤 两个集合的结构要一致,对应的字段数,字段类型 将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 将上面的所有集 GROU ...

  5. python segy格式地震数据读写包segyio学习笔记(二)

    python segy格式地震数据读写包segyio学习笔记(二) 最近大致搞明白了segyio读取叠后和叠前segy数据的方法,以及内部存储结构,以两段代码为例: 叠后数据读取.这是一个从给定时窗内 ...

  6. 用matlab代码进行数据探索、数据清洗学习笔记

    目录 1.说明 2.作文目的 3.数据质量分析3个判别方法 3-1.异常值判别 3-1-1.箱型图法 3-1-2.3σ准(原)则(拉依达准则) 3-2.缺失值判别 3-3.不一致的值判别 4.数据清洗 ...

  7. 在大量数据迁移期间oracle学习笔记

    在数据迁移期间oracle学习笔记 0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态 需求分析: 1.根据上述 ...

  8. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

  9. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

最新文章

  1. spring MVC cors跨域实现源码解析
  2. 解决方法|ESP8266环境搭建出现 usrbinenv bashr :没有那个文件或目录
  3. canny边缘检测算法 opencv_OpenCV-Python Canny边缘检测 | 十九
  4. Python 自动生成环境依赖包 requirements
  5. xshell6左侧导航显示_【iOS12人机交互指南】7.1-导航栏
  6. 字典推导式_Python基础-推导式
  7. 七种武器——.NET工程师求职面试必杀技(转)
  8. 可对Python运行原理进行可视化分析的工具
  9. 使用Vibrator控制手机振动
  10. 解决办法:C++编译中[-Wreorder]
  11. 【深度相机系列二】深度相机原理揭秘--飞行时间(TOF)
  12. 安卓Intent 详解
  13. MAC查看软件安装路径
  14. 思科三层交换机开启ipv6路由功能_网络工程实战之三层交换机配置IPv6 DNS 示例...
  15. 文件搜索工具(Python实现)
  16. Python热门单元测试框架对比:pytest和unittest还傻傻分不清楚?
  17. 作为有经验的程序员如果不懂Lambda表达式就说不过去了吧
  18. 格雷希尔GripSeal外螺纹快速连接器的优点和注意事项
  19. C# 飞行棋小游戏 (控制台应用)
  20. ios与mac的时间问题,修改闹钟时间,24小时制

热门文章

  1. android-hotfix(QQ空间思路)浅析
  2. 学习笔记之23-typedef
  3. 用php人工使网页过期
  4. 数据分析与数据化运营的关键知识点,全在这里了
  5. 从入门到头秃,2018年机器学习图书TOP10
  6. STM32之DMA原理
  7. oracle 嵌套游标慢,oracle 嵌套游标以及java,oracle的时间处理
  8. 【JEEWX企业号专题】JEEWX与微信企业号对接,激活应用回调模式
  9. 工作流中ServiceTask的各种方法
  10. JSF 网站汇总(转)