Code前端首页关于Code前端联系我们

拼多多面试题:如何使用Redis统计独立用户访问量!

terry 2年前 (2023-09-25) 阅读数 57 #后端开发

作者:煞茶敏碎碎年

众所周知,拼多多的薪酬也是高得吓人,在招人方面更是不遗余力。对于一些工作了三年的开发者来说,稍微好一点的会得到30K。提供。

拼多多当然也以加班闻名。每周工作6天是正常的。每天的工作时间基本都在12个小时以上,也是相当辛苦的。

废话少说,今天我们要讲的是一道真实的拼多多后台面试题,这是一道简单的架构题:

拼多多有数亿用户,那么给定的网页你如何使用呢?如何使用Redis统计网站的用户访问量?

使用Hash

Hash是Redis的基本数据结构。 Redis底层维护着一个开放的哈希,将不同的key映射到哈希表中。如果发现关键字冲突,则删除链表。

当用户访问并且用户登录时,我们使用用户的ID。如果用户没有登录,我们还可以在前端页面随机生成一个密钥来识别用户。

当用户获得访问权限时,我们可以使用命令HSET。可以通过选择 URI 及其日期来合并密钥。该字段可以使用用户 ID 或任何标识符,并且该值可以轻松设置为 1。

如果我们想统计某一天特定网站的访问次数,我们可以直接使用 HLEN 即可得到最终结果。 拼多多面试真题:如何用 Redis 统计独立用户访问量!

优点:简单易实现,查询也非常方便,数据准确率非常高。

缺点:占用内存过多,而且随着按键数量的增加,性能也会下降。小网站还好,但是像拼多多这样上亿PV的网站肯定应付不了

使用Bitset

我们知道,对于32位int来说,如果只用它来捕获ID,那么我们只能包含一个用户。但如果我们将其转换为二进制,用每一位代表一个用户,那么我们可以一次代表32个用户,节省32倍的空间!

对于数据量较大的场景,如果我们使用bitset,可以节省大量内存。

对于未登录的用户,我们还可以使用哈希算法将对应的用户ID哈希为数字ID。

位设置非常节省内存。假设有1亿用户,只需要100000000/8/1024/1024,大约等于12兆内存。拼多多面试真题:如何用 Redis 统计独立用户访问量!

Redis给了我们SETBIT方法,使用起来非常方便。

我们可以看下面的例子:

我们可以在项目页面不断使用SETBIT命令来设置用户已经访问过该页面。我们还可以使用方法 GETBIT 来询问用户是否具有访问权限。

最后,我们可以通过BITCOUNT统计该网页每天的访问次数。 拼多多面试真题:如何用 Redis 统计独立用户访问量!

优点占用内存少,易于查询。您可以指定要查询的用户。数据可能存在一些缺陷。对于未登录的用户,可以将不同的密钥分配给同一个ID。否则,必须维护非登录用户。用户分配有额外的开销。

缺点如果用户非常稀疏,占用的内存可能会比方法一大。

使用概率算法

像拼多多这样的网站,多个页面可能有很多访问量,如果要求的数字不太准确,可以使用概率算法。事实上,我们有一个网站的UV。统计显示,1亿和1.03亿其实差不多。

Redis封装了HyperLogLog算法,这是一种基数评估算法。

该算法的特点是数据一般不存储具体的值,而是存储一些相关的数据,用于计算概率。 拼多多面试真题:如何用 Redis 统计独立用户访问量!

当用户访问网站时,我们可以使用命令PFADD来设置相应的命令。最后我们只需要使用PFCOUNT就可以顺利计算出最终的结果,因为这只是一个概率算法,所以可能会有0.81%的误差。

优点占用内存很少。一把钥匙只需要 12 kb。特别适合拥有大量用户的拼多多。

缺点由于未存储具体数据,查询指定用户时可能会出现错误。总数也有误差。

好了,以上就是用Redis统计网站访问量的三种常用方法。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门