Bitmap&hyperloglog&GEO
面试问
- 记录对集合中的数据进行统计
- 在移动应用中,需要统计每天的新增用户数和第2天的留存用户数;
- 在电商网站的商品评论中,需要统计评论列表中的最新评论:
- 在签到打卡中,需要统计一个月内连续打卡的用户数:
- 在网页访问记录中,需要统计独立访客(Unique Visitor,UV)量。
痛点:
类似今日头条、抖音、淘宝这样的额用户访问级别都是亿级的,请问如何处理?
需求痛点
- 亿级数据的收集、清洗、统计、展现
- 需要:存的进、取得快、多维度
一、统计的类型有哪些
-
聚合统计
统计多个集合元素的聚合结果,就是set里面的交差并等集合统计
交并差集和聚合函数的应用
-
排序统计
抖音短视频最新评论留言的场景,请你涉及一个展现列表。考察数据结构和设计思路。
使用zset实现
在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,建议使用zset
-
二值统计
集合元素的取值就只有0和1两种。在钉钉上班签到打卡的场景中,我们只需要记录签到(1)和没签到(0)
一般使用bitmap实现
-
基数统计
指统计一个集合中不重复的元素
一般使用hyperloglog
二、hyperloglog
-
名词
-
UV
Unique Visitor,独立访客,一般理解为客户端IP
需要考虑去重
-
PV
Page View,页面浏览量
不用去重
-
DAU
Daily Active User,日活跃用户量,登录或使用某个产品的用户数(去掉重复登录的用户)
常用于反映网站、互联网应用或网络游戏的运营情况
-
MAU
Monthly Active User,月活跃用户量
-
-
需求
很多计数类场景,比如每日注册IP数、每日访问IP数、页面实时访问数PV、访问用户数UV等。
因为主要的目标高效、巨量地进行计数,所以对存储的数据的内容并不太关心。
也就是说它只能用于统计巨量数量,不太涉及具体的统计对象的内容和精准性。
统计单日一个页面的访问量(PV),单次访问就算一次。
统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。
多个ky的合并统计,某个门户网站的所有模块的PV聚合统计就是整个网站的总PV。
-
是什么
-
基数
是一种数据集,去重复后的真实个数
-
去重复统计功能的基数估计算法,就是hyperloglog
-
基数统计
用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算
-
基本命令
-
-
hyperloglog如何实现的,如何演化的
-
去重的几种方法
-
hashset
-
bitmap
-
hyperloglog概率算法
通过牺牲准确率来换取空间,对于不要求绝对准确率的场景下可以使用,因为概率算法不直接存储数据本身,
通过一定的概率统计方法预估基数值,同时保证误差在一定范围内,由于又不储存数据故此可以大大节约内存。
-
-
如何做到的?如何演化来的
只是进行不重复的基数统计,不是集合也不保存数据,只记录数量而不是具体的内容。
有误差:
hyperloglog提供不精确的去重计数方案,牺牲准确率来换取空间,误差在0.81%左右
论文和出处:http://antirez.com/news/75
-
淘宝网站首页亿级UV的Redis统计方案
-
需求
- UV的统计需要去重,一个用户一天内的多次访问只能算一次
- 淘宝、天猫首页的UV,平均每天是1~1.5个亿左右
- 每天存1.5个亿的IP,访问者来了后先去查是否存在,不存在加入
-
方案
-
使用redis hash存储详细数据
-
使用hyperloglog
-
-
hyperloglog service
-
hyperloglog controller
-
-
三、GEO
面试题说明:
移动互联网时代LBS应越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等。
那这种附近各种形形色色的XXX地址位置选择是如何实现的?
会有什么问题呢?
- 查询性能问题,如果并发高,数据量大这种查询是要搞垮mysq数据库的
- 一般mysql查询的是一个平面矩形访问,而叫车服务要以我为中心N公里为半径的圆形覆盖。
- 精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差,mysql不合适
3.1 redis之GEO
经纬度:
如何获取某个地址的经纬度:使用百度地图等系统
命令复习:
-
GEOADD:添加经纬度坐标
-
GEOPOS:返回经纬度
-
GEOHASH:返回坐标的geohash,geohash算法生成的base32编码值
-
GEODIST:两个位置之间距离
-
GEORADIUS:查找距离中心位置小于XX距离的地点
-
GEORADIUSBYMEMBER
四、bitmap
-
命令复习
-
需求和解决方案
-
bitmap解决方法