05_bitmap&hyperloglog&GEO

Bitmap&hyperloglog&GEO

面试问

  1. 记录对集合中的数据进行统计
  2. 在移动应用中,需要统计每天的新增用户数和第2天的留存用户数;
  3. 在电商网站的商品评论中,需要统计评论列表中的最新评论:
  4. 在签到打卡中,需要统计一个月内连续打卡的用户数:
  5. 在网页访问记录中,需要统计独立访客(Unique Visitor,UV)量。

痛点:

类似今日头条、抖音、淘宝这样的额用户访问级别都是亿级的,请问如何处理?

需求痛点

  1. 亿级数据的收集、清洗、统计、展现
  2. 需要:存的进、取得快、多维度

一、统计的类型有哪些

  1. 聚合统计

    统计多个集合元素的聚合结果,就是set里面的交差并等集合统计

    image-20230310202435718

    交并差集和聚合函数的应用

  2. 排序统计

    抖音短视频最新评论留言的场景,请你涉及一个展现列表。考察数据结构和设计思路。

    image-20230310202753893

    使用zset实现

    image-20230310203037036

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

  3. 二值统计

    集合元素的取值就只有0和1两种。在钉钉上班签到打卡的场景中,我们只需要记录签到(1)和没签到(0)

    一般使用bitmap实现

  4. 基数统计

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

    一般使用hyperloglog

二、hyperloglog

  1. 名词

    1. UV

      Unique Visitor,独立访客,一般理解为客户端IP

      需要考虑去重

    2. PV

      Page View,页面浏览量

      不用去重

    3. DAU

      Daily Active User,日活跃用户量,登录或使用某个产品的用户数(去掉重复登录的用户)

      常用于反映网站、互联网应用或网络游戏的运营情况

    4. MAU

      Monthly Active User,月活跃用户量

  2. 需求

    很多计数类场景,比如每日注册IP数、每日访问IP数、页面实时访问数PV、访问用户数UV等。

    因为主要的目标高效、巨量地进行计数,所以对存储的数据的内容并不太关心。

    也就是说它只能用于统计巨量数量,不太涉及具体的统计对象的内容和精准性。

    统计单日一个页面的访问量(PV),单次访问就算一次。

    统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。

    多个ky的合并统计,某个门户网站的所有模块的PV聚合统计就是整个网站的总PV。

  3. 是什么

    1. 基数

      是一种数据集,去重复后的真实个数

      image-20230310205505716

    2. 去重复统计功能的基数估计算法,就是hyperloglog

      image-20230310205545928

    3. 基数统计

      用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算

    4. 基本命令

      image-20230310205744231

  4. hyperloglog如何实现的,如何演化的

    1. 去重的几种方法

      • hashset

      • bitmap

        image-20230310210406452

      • hyperloglog概率算法

        通过牺牲准确率来换取空间,对于不要求绝对准确率的场景下可以使用,因为概率算法不直接存储数据本身,

        通过一定的概率统计方法预估基数值,同时保证误差在一定范围内,由于又不储存数据故此可以大大节约内存。

    2. 如何做到的?如何演化来的

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

      有误差:

      ​ hyperloglog提供不精确的去重计数方案,牺牲准确率来换取空间,误差在0.81%左右

      论文和出处:http://antirez.com/news/75

      image-20230310211215500

    3. 淘宝网站首页亿级UV的Redis统计方案

      1. 需求

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

        1. 使用redis hash存储详细数据

        2. 使用hyperloglog

          image-20230310212656426

      3. hyperloglog service

      4. hyperloglog controller

三、GEO

面试题说明:

移动互联网时代LBS应越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等。

那这种附近各种形形色色的XXX地址位置选择是如何实现的?

会有什么问题呢?

  1. 查询性能问题,如果并发高,数据量大这种查询是要搞垮mysq数据库的
  2. 一般mysql查询的是一个平面矩形访问,而叫车服务要以我为中心N公里为半径的圆形覆盖。
  3. 精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差,mysql不合适

3.1 redis之GEO

经纬度:

image-20230310215853543

如何获取某个地址的经纬度:使用百度地图等系统

命令复习:

  1. GEOADD:添加经纬度坐标

  2. GEOPOS:返回经纬度

  3. GEOHASH:返回坐标的geohash,geohash算法生成的base32编码值

    image-20230310220254284

  4. GEODIST:两个位置之间距离

  5. GEORADIUS:查找距离中心位置小于XX距离的地点

  6. GEORADIUSBYMEMBER

四、bitmap

  1. 命令复习

    image-20230313214956303

  2. 需求和解决方案

    image-20230313215057654

  3. bitmap解决方法

    image-20230313215140676

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值