当前位置: 首页 > 科技观察

拼多多专访:如何使用Redis统计独立用户访问量?_0

时间:2023-03-19 19:38:21 科技观察

每个人都很体贴,拼多多的酬劳也是惨不忍睹,挖人不遗余力。一些工作3年的开发者,稍微好一点的就会给30K的offer。当然,拼多多也是出了名的加班。一周工作6天很正常,每天的工作时间基本都在12小时以上,也挺辛苦的。废话不多说,今天我们说一道拼多多的真实后台面试题,一道简单的架构题:拼多多有上亿的用户,那么对于某个网页,如何使用Redis来统计一个网站呢?用户访问量?Hash是Redis的一种基本数据结构。Redis底层维护了一个开放的哈希表,将不同的key映射到哈希表中。如果有关键字冲突,那么就会拉出一个链表。当用户访问时,如果用户已经登录,那么我们会使用用户的id,如果用户没有登录,那么我们也可以在前端页面随机生成一个key来标识用户。当用户访问时,我们可以使用HSET命令,key可以选择URI和对应的date拼凑,field可以使用用户的id或者一个随机的标识符,value可以简单的设置为1。当我们想统计某天某个网站的访问量,我们可以直接使用HLEN得到最终结果。优点:简单,容易实现,查询非常方便,数据准确率非常高。缺点:太占内存。随着按键数量的增加,性能也会下降。小网站还好,但像拼多多这样上亿PV的网站肯定受不了。使用Bitset,我们知道对于一个32位的int,如果我们只用它来记录id,那么我们只能记录一个用户,但是如果我们把它转换成二进制,每一位用来代表一个用户,那么我们一口气可以录制代表32个用户,空间节省32倍!对于数据量大的场景,如果我们使用bitset,可以节省很多内存。对于没有登录的用户,我们还可以使用哈希算法,将对应的用户ID哈希成一个数字ID。Bitset非常节省内存。假设有1亿用户,只需要100000000/8/1024/1024,也就是12兆左右的内存。Redis为我们提供了SETBIT方法,使用起来非常方便。我们可以看看下面的例子。我们可以在item页面连续使用SETBIT命令来设置用户访问过该页面,也可以使用GETBIT方法查询某个用户是否访问过。最后,我们可以通过BITCOUNT统计网页每天的访问次数。优点:占用内存少,查询方便。可以指定一个用户查询,数据可能会有点瑕疵。对于非登录用户,不同的key可能映射到同一个id,否则需要为非登录用户维护一个映射。额外的开销。缺点:如果用户非常稀疏,占用的内存可能比方法一大。使用概率算法对于像拼多多这样的网站,可能在多个页面上都有很大的流量,如果要求的数量不是那么准确,可以使用概率算法。其实我们统计一个网站的UV,1亿和10030其实差不多。Redis中封装了HyperLogLog算法,是一种基数求值算法。该算法的特点是数据中一般不存储具体的数值,而是存储一些用于计算概率的相关数据。当用户访问网站时,我们可以使用PFADD命令来设置相应的命令。最后,我们只需要通过PFCOUNT就可以顺利计算出最终的结果。因为这只是一个概率算法,可能会有0.81%的误差。优点:占用内存很小。对于密钥,它只需要12kb。尤其适合拥有大量用户的拼多多。缺点:查询指定用户时,可能会出错,毕竟没有存储具体的数据。总数也有一些误差。以上就是使用Redis统计网站用户访问量的三种常用方法。