【Redis】亿级数据的收集+清洗+统计+展现

news2024/11/27 6:28:31

文章目录

    • 聚合统计(set->共同好友)
    • 排序统计(zset->评论排序)
    • 二值统计(bitmap->签到打卡)
    • 基数统计(hyperloglog->亿级UV统计方案)
    • 地理坐标(GEO)
    • 布隆过滤器
      • 面试题
      • 定义
      • 产生背景
      • 作用
      • 底层原理

聚合统计(set->共同好友)

统计多个集合元素的聚合结果,就是前面讲解过的交差并等集合统计

  • 集合应用的命令

排序统计(zset->评论排序)

抖音短视频最新评论留言的场景,请你设计一个展现列表

考察你的数据结构和设计思路

  • 在面对需要展示最新列表、排行榜等场景时如果数据更新频繁或者需要分页显示,建议使用ZSet

二值统计(bitmap->签到打卡)

集合元素的取值就只有0和1两种

  • 案例

    • 日活统计
    • 连续签到打卡
    • 最近一周的活跃用户
    • 统计指定用户一年之中的登陆天数
    • 某用户按照一年365天,哪几天登陆过?哪几天没有登陆?全年中登录的天数共计多少?
  • bitmap数据类型

    详情见:https://blog.csdn.net/al6nlee/article/details/129822586

    • 即0和1状态表现的二进制位的bit数组
  • 京东签到领取京豆

    一个Byte一个字节 4个byte正好32位,一个月最多31天,sonice

基数统计(hyperloglog->亿级UV统计方案)

统计一个集合中不重复的元素个数

  • 行业名词

    • UV
      • Unique Visitor,独立访客,一般理解为客户端IP
      • 需要去重考虑
    • PV
      • Page View,页面浏览量
      • 不用去重
    • DAU(Daily Active User)
      • 日活跃用户量->登录或者使用了某个产品的用户数(去重复登录的用户)
      • 常用于反映网站、互联网应用或者网络游戏的运营情况
    • MAU
      • 月活跃用户量
  • hyperloglog数据类型

    详情见:https://blog.csdn.net/al6nlee/article/details/129822586

    • 一句话:hyperloglog就是一个集合中不重复的元素的个数,脱水后的真实数据
  • hyperloglog原理

    • 引入

      统计亿级数据的统计

      遍历->bitmap

      • 如果要统计1亿个数据的基数位值,大约需要内存100000000/8/1024/1024约等于12M,内存减少占用的效果显著。
      • 这样得到统计一个对象样本的基数值需要12M。
      • 如果统计10000个对象样本(1w个亿级),就需要117.1875G将近120G,可见使用bitmaps还是不适用大数据量下(亿级)的基数计数场景
      • bitmaps方法是精确计算的

      bitmap->HyperLogLog

      • 对于不要求绝对准确率的场景下可以使用,因为概率算法不直接存储数据本身,通过一定的概率统计方法预估基数值,同时保证误差在一定范围内,由于又不储存数据故此可以大大节约内存。
      • HyperLogLog就是一种概率算法的实现
    • 定义

      只是进行不重复的基数统计,不是集合也不保存数据,只记录数量而不是具体内容

      • Hyperloglog提供不精确的去重计数方案
      • 牺牲准确率来换取空间,误差仅仅只是0.81%左右
  • 淘宝网站首页亿级UV的Redis统计方案

    • 需求

      • UV的统计需要去重,一个用户一天内的多次访问只能算作一次
      • 淘宝、天猫首页的UV,平均每天是1~1.5个亿左右
      • 每天存1.5个亿的IP,访问者来了后先去查是否存在,不存在加入
    • 方案讨论

      • mysql直接忽略

      • redis的hash数据类型->造成bigkey

        <keyDay,<ip,1>>

        • 按照ipv4的结构来说明,每个ipv4的地址最多是15个字节(ip=“192.168.111.1”,最多xxx.xxx.xxx.xxx)
        • 某一天的1.5亿 * 15个字节= 2G,一个月60G
      • hyperloglog

        存储原理

地理坐标(GEO)

  • 经纬度

    国际上规定,把通过英国格林尼治天文台原址的经线叫做0°所以经线也叫本初子午线。在地球上经线指示南北方向,纬线指示东西方向。

    东西半球分界线:东经160° 西经20°

    • 经度(longitude):东经为正数,西经为负数。东西经
    • 纬度(latitude):北纬为正数,南纬为负数。南北纬
  • 获取某个地址的经纬度

    百度api:https://api.map.baidu.com/lbsapi/getpoint/

  • GEO数据类型

    详情见:https://blog.csdn.net/al6nlee/article/details/129822586

  • 美团地图位置附近的酒店推送

    需求

布隆过滤器

面试题

  • 现有50亿个电话号码,现有10万个电话号码如何要快速准确的判断这些电话号码是否已经存在?
  • 判断是否存在,布隆过滤器了解过吗?
  • 安全连接网址,全球数10亿的网址判断
  • 黑名单校验,识别垃圾邮件
  • 白名单校验,识别出合法用户进行后续处理

定义

由一个初值都为零的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素

  • 快速检索出来具体数据是否存在于一个大的集合中
目的减少内存占用
方式不保存数据信息,只是在内存中做一个是否存在的标记flag

产生背景

布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。

它实际上是一个很长的二进制数组(00000000…)+一系列随机hash算法映射函数,主要用于判断一个元素是否在集合中。

通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景,一般想到的是将集合中所有元素保存起来,然后通过比较确定。

链表、树、哈希表等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间也会呈现线性增长,最终达到瓶颈。同时检索速度也越来越慢,上述三种结构的检索时间复杂度分别为O(n),O(logn),O(1)。这个时候,布隆过滤器(Bloom Filter)就应运而生

作用

  • 高效地插入和查询,占用空间少,返回的结果是不确定性+不够完美

    目的减少内存占用
    方式不保存数据信息,只是在内存中做一个是否存在的标记flag
  • 重点

    • 一个元素如果判断结果:存在时,元素不一定存在
    • 但是判断结果为不存在时,则一定不存在
  • 布隆过滤器可以添加元素,但是不能删除元素->由于涉及hashcode判断依据,删掉元素会导致误判率增加。

底层原理

布隆过滤器(Bloom Filter) 是一种专门用来解决去重问题的高级数据结构。

实质就是一个大型位数组和几个不同的无偏hash函数(无偏表示分布均匀)。由一个初值都为零的bit数组和多个个哈希函数构成,用来快速判断某个数据是否存在。但是跟 HyperLogLog 一样,它也一样有那么一点点不精确,也存在一定的误判概率

  • 添加key

    使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,

    每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。

  • 查询key

    只要有其中一位是零就表示这个key不存在,但如果都是1,则不一定存在对应的key。

    **结论:**有,是可能有 无,是肯定无

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DF竞赛平台助力首届“深水云脑杯”全国智慧水务数据创新大赛圆满落幕

首届“深水云脑杯”全国智慧水务数据创新大赛决赛现场 首届“深水云脑杯”全国智慧水务数据创新大赛已圆满落幕&#xff0c;DataFountain大数据竞赛平台&#xff08;简称DF平台&#xff09;作为官方竞赛平台为本次大赛提供办赛支持。该赛事以数字化创新模式为抓手&#xff0c;…

从零学习SDK(6)调试和测试SDK的库

在前面的文章中&#xff0c;我们介绍了什么是SDK&#xff0c;以及如何选择和接入合适的SDK。在本文中&#xff0c;我们将重点讲解如何调试和测试SDK的库&#xff0c;以确保我们的应用能够正常运行&#xff0c;没有错误或异常。 SDK的库是什么呢&#xff1f;简单来说&#xff0…

DAF Trucks EDI项目案例

DAF Trucks是一家荷兰卡车制造商&#xff0c;通过EDI系统与其供应商和客户之间进行电子交换。DAF Trucks EDI系统包括订单处理、发货通知、发票和付款等功能&#xff0c;能够快速、准确地交换业务文档&#xff0c;提高供应链管理水平。DAF计划将其EDI系统扩展到更多的供应商和客…

JavaScript学习笔记(二)

文章目录第4章&#xff1a;变量、作用域与内存1. 原始值与引用值2. 执行上下文与作用域3. 垃圾回收第5章&#xff1a;基本引用类型1. Date&#xff1a;参考了Java早期版本中的java.util.Date2. RegExp3. 原始值包装类型第6章&#xff1a;集合引用类型1. Object2. Array&#xf…

三电技术之电池管理技术

三电技术之电池管理技术 1 功能概述 电池管理系统 (Battery Management System), 即管理电池的充放电&#xff0c;使电池处于一个最佳的状态。 电池是由多个电芯组成的&#xff0c;每个电芯充放电都是一个电化学反应的过程。无论电芯的制造多精密&#xff0c;随着使用时间、…

OpenText 企业内容管理平台介绍

OpenText 企业内容管理平台介绍 将 ECM 扩展到领先的业务应用程序中&#xff0c;为内容添加上下文&#xff0c;从而提高效率和决策能力 突出优点&#xff1a; 1、企业拥有更多数据、更多来源、更多用途并按需提供 2、员工需要一种新的交互、共享和消费内容的方式 3、更多内容需…

系统分析师冲刺班练习题

系统配置与性能评价---性能指标 吞吐量是指网络、设备、端口、虚拟电路或其他设备&#xff0c;单位时间内成功地传送数据的数量&#xff08;以比特、字节、分组等测量&#xff09; 系统配置与性能评价---性能评价方法 指令执行速度法&#xff1a;在计算机发展的初期&#xff…

【C++】2.C++的输入与输出

文章目录前言一、C的输入\出头文件二、C的输入&输出关键字2.1 输出cout2.2 输入cin三、c输入输出与c语言的输入输出前言 c语言中我们使用scanf,printf等来进行输入、输出操作&#xff0c;在C中我们是否有其他方式呢&#xff1f;答案是有的&#xff0c;下面我们来介绍c的输…

JavaSE学习进阶day05_01 Collection集合概述

第九章 Collection集合 9.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合和数组既然都是容器&#xff0c;它们有什么区别呢&#xff1…

快排(动图详细版,快速理解)

注&#xff1a;本文主要介绍六大排序中的快排 文章目录前言一、三大法则1.1 Hoare法1.2 挖坑法1.3 双指针法&#xff08;更加便捷&#xff09;1.4 三种方法时间复杂度计算二、快排栈问题优化方式2.1 三数取中2.2 小区间优化三、非递归快排前言 快速排序是Hoare于1962年提出的一…

生活污水处理设备选购指南

生活污水中含有大量的有机物&#xff08;如蛋白质、碳水化合物、脂肪、尿素、氨氮等&#xff09;及大量的病原微生物&#xff0c;可导致传染病蔓延流行。因此&#xff0c;生活污水在排放前&#xff0c;需要进行处理。那么如何正确的选择生活污水处理设备呢&#xff1f; 一、生活…

移动机器人设计与实践-基础概念汇总

如下全文在关键词提示词等脚本交互下&#xff0c;由文图版本生成式人工智能在1分钟内创作完成。 AI自动生成文章评分已经远超大部分博文评分值。 人类社会经历过农业时代&#xff08;最强代表汉唐&#xff09;-工业时代&#xff08;最强代表日不落帝国&#xff09;-信息时代&a…

利用MyBatis实现CRUD操作

文章目录一、添加按姓名查询用户记录功能1、添加按姓名查询的映射语句2、在用户映射器接口里添加按姓名查询用户记录的方法3、添加按姓名查询用户记录的测试方法4、测试按姓名查询用户记录二、插入表记录1、在UserMapper.xml里增加映射语句 - insert2、在UserMapper接口里增加i…

【三十天精通Vue 3】第七天 Vue 3 响应式系统详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 响应式系统概述1.1 响应式系统的简介1.2 响应式系统…

【软件设计师14】UML建模

UML建模 稳定出一个&#xff0c;但是由于UML的图比较多&#xff0c;所以这种题比数据流图和数据库难度高 一般都会考用例图和类图&#xff0c;再附加其他的图 1. 用例图 包含关系include&#xff1a;比如登记外借信息必须先有用户登录 扩展关系extend&#xff1a;修改书籍…

C语言--文件操作--一起深入了解文件相关函数的知识

目录前言1.什么是文件1.1程序文件1.2数据文件1.3文件名2.文件的打开与关闭2.1文件指针2.2文件的打开与关闭fopen函数fclose函数3.文件的顺序读写3.1对比一组函数fputc函数fgetc函数fputs函数fgets函数fprintf函数fscanf函数fwrite函数fread函数4.1对比一组函数sprintfsscanf5.文…

ClickUp的最佳替代品,可更好地管理项目

ClickUp 是项目管理类的常见工具&#xff0c;它因团队协作、沟通、免费试用和强大功能等因素受到用户的喜爱。 该工具支持你清晰组织多个项目、进行团队协作并跟踪项目目标的实时进度。不同的视图选项使您能够为所有活动构建完美的工作流程。 尽管它很受欢迎&#xff0c;但用户…

ics-05(命令执行漏洞及伪协议读取)

打开链接&#xff0c;似曾相识的感觉&#xff08;前面做过一道题叫ics-06&#xff0c;那道题是对id的一个爆破&#xff09; 尝试后发现只有设备维护中心可以跳转 这和我们使用御剑扫描出来的结果是一样的 使用PHP伪协议读取 index.php 页面 构造payload&#xff08;在愚人杯ht…

小黑跟尚香一起疯狂星期四,然后慢慢跑回家,生活逐渐明朗,完赛了副中心全程马拉松的leetcode之旅:752. 打开转盘锁

宽度优先搜索法 class Solution:def openLock(self, deadends: List[str], target: str) -> int:# 目的地在死亡数组里if target in deadends:return -1# 起点在死亡数字里if 0000 in deadends:return -1# 起点就是目标字符串if 0000 target:return 0# 定义前向函数def pr…

Python与c语言的区别与联系

Python与c语言都是一种机器学习语言&#xff0c;进过长时间的学习和总结&#xff0c;我将Python与c语言的一些特点总结成以下几点&#xff0c;不全面还望多多指正。 1、因为C语言是编译型语言&#xff0c;python是解释型语言&#xff0c;所以python的执行速度没有C语言那么快。…