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

阅读本文大概需要 2.8 分钟。

作者:沙茶敏碎碎念

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

原文链接:

www.toutiao.com/i6695734985246114312/

·END·

程序员的成长之路

路虽远,行则必至

本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。

回复 [ 520 ] 领取程序员最佳学习方式

回复 [ 256 ] 查看 Java 程序员成长规划

原文地址:https://www.cnblogs.com/gdjk/p/11008010.html

时间: 2024-11-03 18:32:27

拼多多面试真题:如何用 Redis 统计独立用户访问量!的相关文章

拼多多后台开发面试真题:如何用Redis统计独立用户访问量

众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过12个小时,也是相当辛苦的.废话不多说,今天我们来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢? 使用Hash 哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到

2018 拼多多 校招真题 最大乘积

最大乘积 时间限制:1秒 空间限制:32768K 热度指数:8197 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE. 题目描述 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出描述: 满足条件的最大乘积 示例1 输入 3 4 1 2 输出 8 思路分析:看到这个题目,下意识想到用Arrays.sort()排一下序, 因为输入的整数可以是负

WEB前端开发 辨析类 面试真题 大集锦

WEB前端开发 辨析类 面试真题 大集锦 HTML5学堂-码匠:面试里最常出现的问题句式大概就是"说说XXX和XXX的区别""谈谈XXX和XXX的不同"了吧~!一波波的辨析题正在袭来,快快开启防御,杀出重围,来一场绝地反击! 僵尸,啊,不对,辨析三连发! 扫描了众多的面试题,发现--额--各个技术之间的辨析真的是如僵尸一般,一波一波的~ 相信不少人都在面试当中遇到过各类的辨析题,面试的画风大概是这样的 -- 面试官:strong.em.b.i的区别是什么? 面试官:

乾颐堂安德HCIE面试真题系列22(许WH)

HCIE面试真题,拿到考题顺序是这样的:1.EP端口在现网环境的应用 2.ospf建立邻居的条件 3.LAB中流量×××中的应用第二次面试时间8月9号上午10:45,当时进考场的时候我听刚出来的几个面试的考生说pim-sm的,心里还比较高兴,晚上刚撸过组播的很熟.然后进考场开始自我介绍,我说刚开始在甲方考官就说那刚好,你在EP的应用上说一说.第一题:EP在现网环境的应用按照题库我开始先说EP口的特点,当说到从EP口收到BPDU包后变为普通端口,然后给画图举例子,然后我把自己绕进去了,考官就让画两

使用 Redis 统计在线用户人数

在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线用户的数量进行统计, 但每个方案都有一些自己特有的操作, 并且各个方案的性能特征以及资源消耗也各有不同. 方案 1 :使用有序集合 每当一个用户上线时, 我们就执行 ZADD 命令, 将这个用户以及它的在线时间添加到指定的有序集合中: ZADD "online_users" <use

乾颐堂安德HCIE面试真题系列20(董XG),一个失败的案例

20180720董XG杭州面试 1.ppp2.割接3.ospf中邻居建立不起来的原因 上面也是我回答问题的顺序. ppp我就按照我之前模拟面试的时候,按照题库里面往下背,这个我之前也复习到了,就在今天火车上,我还看到了,这题挺顺利,答了大概30分钟吧,中途提问过一句,就是chap认证的用户名为空的时候怎么回事和有用户名的时候分别解释下,她不问的话,我也会说的,正好她也问了,这题我感觉满分. 割接,很久之前预习过,近期也没怎么看,近期就准备理论了,就边回忆题库里面的东西边说了自己工作中碰到的机房迁

7年Java老兵闭关整理出430道面试真题,全部掌握阿里也不过如此!

题目基本覆盖了整个Java后端题,因文章篇幅问题,我这里就不解答了,我已把题目整理成pdf文档,内容很全面,有需要的可以 点击这里 获取资料 话不多说,直接往下看↓ ↓ ↓ 一.性能调优面试专栏 1.1.tomcat性能优化整理 你这样给tomcat调优 如何加大comcat连接数 怎样加大tomcat的内存 Tomcat有几种部署方式 Tomcat的优化经验 1.2.JVM性能优化整理 Java类加载过程 Java内存分配 描述一下jVM加载class文件的原理机制? GC是什么?为什么要有G

2019年大厂Java面试真题合辑放送

java 后端面试题1.List 和 Set 的区别 2.HashSet 是如何保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)? 4.HashMap 的扩容过程 5.HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的? 6.对象的四种引用 7.Java获取反射的三种方法 8.Java反射机制 9.Arrays.sort 和 Collections.sort 实现原理 和区别 10.LinkedHashMa

web前端面试真题! 面试的经历和回答只做参考1

xxxxx网络有限公司:下午1点50分左右到达公司附近,3点左右找到公司,因为公司周围环境不是很好,位置也很偏僻,关键是当时公司就3个人,当时想着:就算不在这里工作最起码要了解下面试过程什么的,所以在面试时完全不紧张,整个过程就像闲聊一样. 1.先自我介绍下? 好的,我叫xxx,毕业于xxxx,之前在xxxxx做WEB前端工作2年左右,10月底辞职到厦门,以后打算在厦门长期发展. 2.node是什么? node是服务端的JS,是一个事件驱动的非阻塞的I/O服务端js环境,本质上是对google