速读摘要文章源自JAVA秀-https://www.javaxiu.com/18849.html
拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢?当我们要统计某一个网站某一天的访问量的时候,就可以直接使用HLEN来得到最终的结果了。缺点如果用户非常的稀疏,那么占用的内存可能比方法一更大。对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。文章源自JAVA秀-https://www.javaxiu.com/18849.html
原文约 3396 字 | 图片 10 张 | 建议阅读 7 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/18849.html
拼多多面试真题:如何用 Redis 统计独立用户访问量!
点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/18849.html
收录于话题文章源自JAVA秀-https://www.javaxiu.com/18849.html
#Java基基文章源自JAVA秀-https://www.javaxiu.com/18849.html
16个文章源自JAVA秀-https://www.javaxiu.com/18849.html
点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/18849.html
做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html 源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/18849.html
原创 | Java 2020 超神之路,很肝~文章源自JAVA秀-https://www.javaxiu.com/18849.html
中文详细注释的开源项目文章源自JAVA秀-https://www.javaxiu.com/18849.html
RPC 框架 Dubbo 源码解析文章源自JAVA秀-https://www.javaxiu.com/18849.html
网络应用框架 Netty 源码解析文章源自JAVA秀-https://www.javaxiu.com/18849.html
消息中间件 RocketMQ 源码解析文章源自JAVA秀-https://www.javaxiu.com/18849.html
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析文章源自JAVA秀-https://www.javaxiu.com/18849.html
作业调度中间件 Elastic-Job 源码解析文章源自JAVA秀-https://www.javaxiu.com/18849.html
分布式事务中间件 TCC-Transaction 源码解析文章源自JAVA秀-https://www.javaxiu.com/18849.html
Eureka 和 Hystrix 源码解析文章源自JAVA秀-https://www.javaxiu.com/18849.html
Java 并发源码文章源自JAVA秀-https://www.javaxiu.com/18849.html
来源:toutiao.com/i6695734985246114312/文章源自JAVA秀-https://www.javaxiu.com/18849.html
使用 Hash文章源自JAVA秀-https://www.javaxiu.com/18849.html
使用 Bitset文章源自JAVA秀-https://www.javaxiu.com/18849.html
使用概率算法文章源自JAVA秀-https://www.javaxiu.com/18849.html
大家好,我是基基!文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过12个小时,也是相当辛苦的。废话不多说,今天我们来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢?文章源自JAVA秀-https://www.javaxiu.com/18849.html
使用 Hash
哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字冲突,那么就会拉出一个链表出来。文章源自JAVA秀-https://www.javaxiu.com/18849.html
当一个用户访问的时候,如果用户登录过,那么我们就使用用户的id,如果用户没有登录过,那么我们也能够前端页面随机生成一个key用来标识用户,当用户访问的时候,我们可以使用HSET 命令,key可以选择URI与对应的日期进行拼凑,field可以使用用户的id或者随机标识,value可以简单设置为1。文章源自JAVA秀-https://www.javaxiu.com/18849.html
当我们要统计某一个网站某一天的访问量的时候,就可以直接使用HLEN 来得到最终的结果了。文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
优点: 简单,容易实现,查询也是非常方便,数据准确性非常高。文章源自JAVA秀-https://www.javaxiu.com/18849.html
缺点: 占用内存过大,。随着key的增多,性能也会下降。小网站还行,拼多多这种数亿PV的网站肯定受不了文章源自JAVA秀-https://www.javaxiu.com/18849.html
使用 Bitset
我们知道,对于一个32位的int,如果我们只用来记录id,那么只能够记录一个用户,但如果我们转成2进制,每位用来表示一个用户,那么我们就能够一口气表示32个用户,空间节省了32倍!对于有大量数据的场景,如果我们使用bitset,那么,可以节省非常多的内存。对于没有登录的用户,我们也可以使用哈希算法,把对应的用户标识哈希成一个数字id。bitset非常的节省内存,假设有1亿个用户,也只需要100000000/8/1024/1024约等于12兆内存。文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
Redis已经为我们提供了SETBIT 的方法,使用起来非常的方便,我们可以看看下面的例子,我们在item页面可以不停地使用SETBIT 命令,设置用户已经访问了该页面,也可以使用GETBIT 的方法查询某个用户是否访问。最后我们通过BITCOUNT 可以统计该网页每天的访问数量。文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
优点 占用内存更小,查询方便,可以指定查询某个用户,数据可能略有瑕疵,对于非登录的用户,可能不同的key映射到同一个id,否则需要维护一个非登录用户的映射,有额外的开销。文章源自JAVA秀-https://www.javaxiu.com/18849.html
缺点 如果用户非常的稀疏,那么占用的内存可能比方法一更大。文章源自JAVA秀-https://www.javaxiu.com/18849.html
使用概率算法
对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法,事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。在Redis中,已经封装了HyperLogLog算法,他是一种基数评估算法。这种算法的特征,一般都是数据不存具体的值,而是存用来计算概率的一些相关数据。文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
当用户访问网站的时候,我们可以使用PFADD 命令,设置对应的命令,最后我们只要通过PFCOUNT 就能顺利计算出最终的结果,因为这个只是一个概率算法,所以可能存在0.81%的误差。文章源自JAVA秀-https://www.javaxiu.com/18849.html
优点 占用内存极小,对于一个key,只需要12kb。对于拼多多这种超多用户的特别适用。文章源自JAVA秀-https://www.javaxiu.com/18849.html
缺点 查询指定用户的时候,可能会出错,毕竟存的不是具体的数据。总数也存在一定的误差。文章源自JAVA秀-https://www.javaxiu.com/18849.html
好了,上面就是常见的3种适用Redis统计网站用户访问数的方法了。文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/18849.html
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/18849.html
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章源自JAVA秀-https://www.javaxiu.com/18849.html
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)文章源自JAVA秀-https://www.javaxiu.com/18849.html
阅读原文文章源自JAVA秀-https://www.javaxiu.com/18849.html

评论