上海专业高端网站建设,网站怎么做好 优帮云,设计方案步骤,wordpress怎么做小说站作者 | 沙茶敏碎碎念来源 | www.cnblogs.com/xiaoMzjm/p/5223799.html众所周至#xff0c;拼多多的待遇也是高的可怕#xff0c;在挖人方面也是不遗余力#xff0c;对于一些工作3年的开发#xff0c;稍微优秀一点的#xff0c;都给到30K的Offer当然#xff0c;拼多多加班… 作者 | 沙茶敏碎碎念来源 | www.cnblogs.com/xiaoMzjm/p/5223799.html众所周至拼多多的待遇也是高的可怕在挖人方面也是不遗余力对于一些工作3年的开发稍微优秀一点的都给到30K的Offer当然拼多多加班也是出名的一周上6天班是常态每天工作时间基本都是超过12个小时也是相当辛苦的。废话不多说今天我们来聊一聊拼多多的一道后台面试真题是一道简单的架构类的题目拼多多有数亿的用户那么对于某个网页怎么使用Redis来统计一个网站的用户访问数呢使用Hash哈希是Redis的一种基础数据结构Redis底层维护的是一个开散列会把不同的key映射到哈希表上如果是遇到关键字冲突那么就会拉出一个链表出来。当一个用户访问的时候如果用户登陆过那么我们就使用用户的id如果用户没有登陆过那么我们也能够前端页面随机生成一个key用来标识用户当用户访问的时候我们可以使用HSET命令key可以选择URI与对应的日期进行拼凑field可以使用用户的id或者随机标识value可以简单设置为1。当我们要统计某一个网站某一天的访问量的时候就可以直接使用HLEN来得到最终的结果了。优点简单容易实现查询也是非常方便数据准确性非常高。缺点占用内存过大。随着key的增多性能也会下降。小网站还行拼多多这种数亿PV的网站肯定受不了使用Bitset我们知道对于一个32位的int如果我们只用来记录id那么只能够记录一个用户但如果我们转成2进制每位用来表示一个用户那么我们就能够一口气表示32个用户空间节省了32倍对于有大量数据的场景如果我们使用bitset那么可以节省非常多的内存。对于没有登陆的用户我们也可以使用哈希算法把对应的用户标识哈希成一个数字id。bitset非常的节省内存假设有1亿个用户也只需要100000000/8/1024/1024约等于12兆内存。Redis已经为我们提供了SETBIT的方法使用起来非常的方便我们可以看看下面的例子我们在item页面可以不停地使用SETBIT命令设置用户已经访问了该页面也可以使用GETBIT的方法查询某个用户是否访问。最后我们通过BITCOUNT可以统计该网页每天的访问数量。优点占用内存更小查询方便可以指定查询某个用户数据可能略有瑕疵对于非登陆的用户可能不同的key映射到同一个id否则需要维护一个非登陆用户的映射有额外的开销。缺点如果用户非常的稀疏那么占用的内存可能比方法一更大。使用概率算法对于拼多多这种多个页面都可能非常多访问量的网站如果所需要的数量不用那么准确可以使用概率算法事实上我们对一个网站的UV的统计1亿跟1亿零30万其实是差不多的。在Redis中已经封装了HyperLogLog算法他是一种基数评估算法。这种算法的特征一般都是数据不存具体的值而是存用来计算概率的一些相关数据。当用户访问网站的时候我们可以使用PFADD命令设置对应的命令最后我们只要通过PFCOUNT就能顺利计算出最终的结果因为这个只是一个概率算法所以可能存在0.81%的误差。优点占用内存极小对于一个key只需要12kb。对于拼多多这种超多用户的特别适用。缺点查询指定用户的时候可能会出错毕竟存的不是具体的数据。总数也存在一定的误差。上面就是常见的3种适用Redis统计网站用户访问数的方法了。推荐阅读Java面试题汇总208道
【END】
关注下方二维码订阅更多精彩内容