众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作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统计网站用户访问数的方法了。

拼多多面试|如何用 Redis 统计独立用户访问量?相关推荐

  1. 拼多多面试:如何用 Redis 统计独立用户访问量?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:沙茶敏碎碎念 来源:https://url.cn/5tQPE ...

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

    作者 | 沙茶敏碎碎念 来源 | http://toutiao.com/i6695734985246114312/ 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发, ...

  3. 拼多多的真实面试题:数亿的用户,如何用Redis统计独立用户访问量

    众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...

  4. discuz设置用户每天回帖数_如何用Redis统计独立用户访问量,除了Hash跟Bitset,还有这个...

    众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...

  5. 拼多多面试官没想到RabbitMQ我早就入门了,人直接傻掉

    拼多多面试官没想到RabbitMQ我早就入门了,人直接傻掉. 人一辈子最值得炫耀的不应该是你的财富有多少(虽然这话说得有点违心,呵呵),而是你的学习能力.技术更新迭代的速度非常快,那作为程序员,我们就 ...

  6. 如何用redis做活跃用户统计-HyperLoglog

    原文在这里: 如何用redis做活跃用户统计-HyperLoglog 网站经常有这样的需求:统计日活用户数,有哪些实现方式呢? 第一种做法:用redis的set集合. 用户登录以后,把用户id添加到r ...

  7. 2019校招内推拼多多面试总结

    感想 我想这次应该是我凭实力得到的第一个比较满意的offer了,没想到是拼多多给的offer,我也感谢面试我的那些面试官,没有为难我. 过程 拼多多 一面 1.自我介绍 2.树模型,GBDT的原理,x ...

  8. 阿里,腾讯,拼多多面试必挂:面对千万级、亿级流量怎么处理?

    这是一道很常见的面试题,但是大多数人并不知道怎么回答,这种问题其实可以有很多形式的提问方式,你一定见过而且感觉无从下手: 面对业务急剧增长你怎么处理? 业务量增长10倍.100倍怎么处理? 你们系统怎 ...

  9. 拼多多面试问了数据库基础知识,今天分享出来

    点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个被微信官方推荐过的逗比,本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试常考点. 前言 我是个标 ...

最新文章

  1. 思科基本配置脚本命令
  2. python中操作数据库中游标的使用方法
  3. [转载]对复旦食堂的印象
  4. Kubernetes容器集群 - harbor仓库高可用集群部署说明
  5. TypeError: sequence item 0: expected str instance, int found
  6. 聊聊六位半万用表电路(一)——保护
  7. 前端笔记之——ajax请求出现406的原因
  8. 华为mate30pro和华为p40pro哪个好
  9. 安装Windows11体验WSA,安装常用Android应用测试
  10. 张振民北京计算机专修学院,工行甘肃省分行张振民一行来校考察交流
  11. c语言规定 程序中各函数之间().,C语言基础笔试题
  12. 【Unity】创建一个自己的可交互AR安卓程序
  13. 达内python培训课程
  14. Android项目中接入网易云信聊天
  15. Locust使用手册--Locust配置
  16. 索尼22亿美元购百代 将控制全球1/3音乐出版
  17. Android 性能测试及弱网测试要点
  18. php实现图片上传和显示,上传和显示图片 - php - 生活点滴
  19. 做哪些生意可以年入百万,年入百万的职业有哪些?
  20. Java工程师的工资高吗?一般多少钱?

热门文章

  1. 大神教你实现redis键空间通知
  2. mysql文件头标记_通过文件头准确识别PHP上传的文件类型 ( 一 )
  3. 初识C语言---(2)
  4. 关于TensorFlow报错ModuleNotFoundError: No module named ‘imutils‘
  5. 关于学习Python的一点学习总结(42->继承list)
  6. 线段树分裂与合并的模板以及空间大小的计算
  7. react 让滚动条一直在下面_Ink 2.0 发布:命令行应用程序的 React
  8. postman 使用_如何使用Postman实现数据驱动?
  9. 模板 - 二分图(包含全套常用定理性质)
  10. 【图论专题】无向图的双连通分量