拼多多面试题:如何使用Redis统计独立用户访问量!
作者:煞茶敏碎碎年
众所周知,拼多多的薪酬也是高得吓人,在招人方面更是不遗余力。对于一些工作了三年的开发者来说,稍微好一点的会得到30K。提供。
拼多多当然也以加班闻名。每周工作6天是正常的。每天的工作时间基本都在12个小时以上,也是相当辛苦的。
废话少说,今天我们要讲的是一道真实的拼多多后台面试题,这是一道简单的架构题:
拼多多有数亿用户,那么给定的网页你如何使用呢?如何使用Redis统计网站的用户访问量?
使用Hash
Hash是Redis的基本数据结构。 Redis底层维护着一个开放的哈希,将不同的key映射到哈希表中。如果发现关键字冲突,则删除链表。
当用户访问并且用户登录时,我们使用用户的ID。如果用户没有登录,我们还可以在前端页面随机生成一个密钥来识别用户。
当用户获得访问权限时,我们可以使用命令HSET。可以通过选择 URI 及其日期来合并密钥。该字段可以使用用户 ID 或任何标识符,并且该值可以轻松设置为 1。
如果我们想统计某一天特定网站的访问次数,我们可以直接使用 HLEN 即可得到最终结果。
优点:简单易实现,查询也非常方便,数据准确率非常高。
缺点:占用内存过多,而且随着按键数量的增加,性能也会下降。小网站还好,但是像拼多多这样上亿PV的网站肯定应付不了
使用Bitset
我们知道,对于32位int来说,如果只用它来捕获ID,那么我们只能包含一个用户。但如果我们将其转换为二进制,用每一位代表一个用户,那么我们可以一次代表32个用户,节省32倍的空间!
对于数据量较大的场景,如果我们使用bitset,可以节省大量内存。
对于未登录的用户,我们还可以使用哈希算法将对应的用户ID哈希为数字ID。
位设置非常节省内存。假设有1亿用户,只需要100000000/8/1024/1024,大约等于12兆内存。
Redis给了我们SETBIT方法,使用起来非常方便。
我们可以看下面的例子:
我们可以在项目页面不断使用SETBIT命令来设置用户已经访问过该页面。我们还可以使用方法 GETBIT 来询问用户是否具有访问权限。
最后,我们可以通过BITCOUNT统计该网页每天的访问次数。
优点占用内存少,易于查询。您可以指定要查询的用户。数据可能存在一些缺陷。对于未登录的用户,可以将不同的密钥分配给同一个ID。否则,必须维护非登录用户。用户分配有额外的开销。
缺点如果用户非常稀疏,占用的内存可能会比方法一大。
使用概率算法
像拼多多这样的网站,多个页面可能有很多访问量,如果要求的数字不太准确,可以使用概率算法。事实上,我们有一个网站的UV。统计显示,1亿和1.03亿其实差不多。
Redis封装了HyperLogLog算法,这是一种基数评估算法。
该算法的特点是数据一般不存储具体的值,而是存储一些相关的数据,用于计算概率。
当用户访问网站时,我们可以使用命令PFADD来设置相应的命令。最后我们只需要使用PFCOUNT就可以顺利计算出最终的结果,因为这只是一个概率算法,所以可能会有0.81%的误差。
优点占用内存很少。一把钥匙只需要 12 kb。特别适合拥有大量用户的拼多多。
缺点由于未存储具体数据,查询指定用户时可能会出现错误。总数也有误差。
好了,以上就是用Redis统计网站访问量的三种常用方法。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。