目录
为什么出现这3个类型
示例:
手机App中的每天的⽤⼾登录信息:1天对应1系列⽤⼾ID或移动设备ID;
电商⽹站上商品的⽤⼾评论列表:1个商品对应了1系列的评论;
⽤⼾在⼿机App上的签到打卡信息:1天对应1系列⽤⼾的签到记录;
应⽤⽹站上的⽹⻚访问信息:1个⽹⻚对应1系列的访问点击
面试问
记录对集合中的数据进行统计
在移动应用中,需要统计每天的新增用户数和第2天的留存用户数;
在电商网站的商品评论中,需要统计评论列表中的最新评论;
在签到打卡中,需要统计一个月内连续打卡的用户数;
在网页访问记录中,需要统计独立访客(UniqueVisitor,UV)量。
。。。。。。
需求痛点
数据量较大的收集+统计
需要 存的进+取得快+多统计
真正有价值的是统计。。。
统计的类型有哪些-亿级系统中常见的四种统计
聚合统计
- 统计多个集合元素的聚合结果,就是前面说过的交差并等集合统计
- 交并差集的聚合函数的应用
排序统计
- 抖音视频最新评论留言的场景,请你设计一个展现列表。考察你的数据结构和设计思路
- 设计案例和回答思路
以抖音vcr最新的留言评价为案例,所有评论需要两个功能,按照时间排序+分页显示
能够排序+分页显示的redis数据结构是什么合适?
- List
每个商品评论对应一个list集合,这个list包含了对这个商品的所有评论,而且会按照评论时间保存这些评论。
每来一个新评论就用LPUSH命令把他插入list的队头。
但是,如果在展示第二页之前,又产生了一条新评论,第2页的评论不一样了。
原因:list是通过元素在list中的位置来排序的,当有一个新元素插入时,原先的元素在list中就都后移了一位,原来在1的元素现在排在了第2位,当lrange读取时,就会读到旧数据。
- Zset
- 在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页展示,建议使用zset
二值统计
集合元素的取值就只有0和1两种。
在钉钉上班签到打卡的场景中,我们只用记录有签到(1)或没签到(0)
具体见bitmap。
基数统计
指统计一个集合中不重复的元素个数
具体见hyperloglog
Bitmap
是什么
一句话:由0和1状态表现的二进制位的bit数组
说明:用string类型作为底层数据结构实现的一种统计二值状态的数据类型。
位图的本质是数组,它是基于string数据类型的按位的操作。
该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们可以称之为一个索引或者位格)。
Bitmap支出的最大位数是2的32次方位,他可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32 = 4294967296)
能干嘛
用于状态统计:Y/N,类似AtomicBoolean
根据需求
用户是否登陆过Y、N,比如京东每日签到送京豆
电影、广告是否被点击播放过
钉钉打卡上下班,签到统计
。。。
真实案例
日活统计
连续签到打卡
最近一周的活跃用户
统计指定用户一年中的登录天数
某用户按照一年365天,哪几天登录过?哪几天没有登录?全年登录的天数共计多少?
签到领取京豆
需求说明:
签到日历仅展示当月签到数据
签到日历需展示最近连续签到天数
假设当前日期是20210618,且20210616未签到
若20210617已签到且0618未签到,则连续签到天数为1
若20210617已签到且0618已签到,则连续签到天数为2
连续签到天数越多,奖励越大
所有用户均可签到
截至2020年3月31日的12个月,京东年度活跃用户数3.87亿,同比增长24.8%