首页
下载应用
提交文章
关于我们
🔥 热搜 🔥
1
上海
2
习近平
3
新疆
4
鄂州父女瓜
5
乌鲁木齐
6
疫情
7
H工口小学生赛高
8
习明泽
9
芊川一笑图包
10
印尼排华
分类
社会
娱乐
国际
人权
科技
经济
其它
首页
下载应用
提交文章
关于我们
🔥
热搜
🔥
1
上海
2
习近平
3
新疆
4
鄂州父女瓜
5
乌鲁木齐
6
疫情
7
H工口小学生赛高
8
习明泽
9
芊川一笑图包
10
印尼排华
分类
社会
娱乐
国际
人权
科技
经济
其它
付鹏 —— 《2024年年终回顾和2025年展望——对冲风险VS软着陆》
清华女神,34岁的美女博士县长,辞职了
13人被撤销本届全国政协委员资格丨时政周报
豆瓣9.7!鲁迅赞叹不已、余华为它失眠,看完后劲太大···
“湿冷魔法”攻击!鸟家三合一冲锋衣、羽绒服、软壳裤帮你抵挡
生成图片,分享到微信朋友圈
查看原文
其他
拼多多面试题:如何用 Redis 统计独立用户访问量?
Java技术栈
2020-10-08
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,
对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer。
当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过12个小时,也是相当辛苦的。
废话不多说,今天我们来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:
拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢?
1、Hash
哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字冲突,那么就会拉出一个链表出来。
当一个用户访问的时候,如果用户登陆过,那么我们就使用用户的id,如果用户没有登陆过,那么我们也能够前端页面随机生成一个key用来标识用户
当用户访问的时候,我们可以使用
HSET
命令,key可以选择URI与对应的日期进行拼凑,field可以使用用户的id或者随机标识,value可以简单设置为1。
当我们要统计某一个网站某一天的访问量的时候,就可以直接使用
HLEN
来得到最终的结果了。
优点
:简单,容易实现,查询也是非常方便,数据准确性非常高。
缺点
:占用内存过大,。随着key的增多,性能也会下降。小网站还行,拼多多这种数亿PV的网站肯定受不了。
2、Bitset
我们知道,对于一个32位的int,如果我们只用来记录id,那么只能够记录一个用户,但如果我们转成2进制,每位用来表示一个用户,那么我们就能够一口气表示32个用户,空间节省了32倍!
对于有大量数据的场景,如果我们使用bitset,那么可以节省非常多的内存。推荐:
Redis 21问
,你会几道?
对于没有登陆的用户,我们也可以使用哈希算法,把对应的用户标识哈希成一个数字id。bitset非常的节省内存,假设有1亿个用户,也只需要100000000/8/1024/1024约等于12兆内存。
Redis已经为我们提供了
SETBIT
的方法,使用起来非常的方便,我们可以看看下面的例子。
关注微信公众号:Java技术栈,在后台回复:
redis
,可以获取我整理的 N 篇最新
Redis
教程,都是干货。
我们在item页面可以不停地使用
SETBIT
命令,设置用户已经访问了该页面,也可以使用
GETBIT
的方法查询某个用户是否访问。最后我们通过
BITCOUNT
可以统计该网页每天的访问数量。
优点
:
占用内存更小,查询方便,可以指定查询某个用户,数据可能略有瑕疵,对于非登陆的用户,可能不同的key映射到同一个id,否则需要维护一个非登陆用户的映射,有额外的开销。
缺点
:
如果用户非常的稀疏,那么占用的内存可能比方法一更大。
3、概率算法
对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法
事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。
在
Redis
中,已经封装了HyperLogLog算法,他是一种基数评估算法。这种算法的特征,一般都是数据不存具体的值,而是存用来计算概率的一些相关数据。
当用户访问网站的时候,我们可以使用
PFADD
命令,设置对应的命令,最后我们只要通过
PFCOUNT
就能顺利计算出最终的结果,因为这个只是一个概率算法,所以可能存在0.81%的误差。
优点
:
占用内存极小,对于一个key,只需要12kb。对于拼多多这种超多用户的特别适用。
缺点
:
查询指定用户的时候,可能会出错,毕竟存的不是具体的数据。总数也存在一定的误差。
上面就是常见的3种适用Redis统计网站用户访问数的方法了。
分享一份 2019 最新 Java 架构师学习资料
作者:沙茶敏碎碎念
来源:https://url.cn/5tQPEQg
- END -
推荐阅读:
1、
全球 IPv4 地址正式耗尽
2、
为什么微服务一定要有网关?
3、
Spring 最常用的 7 大类注解,史上最强整理
4、
注意了,千万不要在MySQL中使用UTF-8
5、
歪国人整理的 2019 年 Java 开发路线图!
关注
Java技术栈
公众号在后台回复:
Java
,可获取一份栈长整理的最新 Java 技术干货。
点击「
阅读原文
」和栈长学更多~
您可能也对以下帖子感兴趣
{{{title}}}
文章有问题?点此查看未经处理的缓存