拼多多面试真题:如何用 Redis 统计独立用户访问量!
作者 | 沙茶敏碎碎念
来源 | http://toutiao.com/i6695734985246114312/
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过12个小时,也是相当辛苦的。废话不多说,今天我们来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢?
使用 Hash
哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字冲突,那么就会拉出一个链表出来。
当一个用户访问的时候,如果用户登录过,那么我们就使用用户的id,如果用户没有登录过,那么我们也能够前端页面随机生成一个key用来标识用户,当用户访问的时候,我们可以使用HSET 命令,key可以选择URI与对应的日期进行拼凑,field可以使用用户的id或者随机标识,value可以简单设置为1。
当我们要统计某一个网站某一天的访问量的时候,就可以直接使用HLEN 来得到最终的结果了。
Spring越来越强,而我们越来越快餐!离开了Spring,居然API都写不出来了!
优点: 简单,容易实现,查询也是非常方便,数据准确性非常高。
缺点: 占用内存过大,。随着key的增多,性能也会下降。小网站还行,拼多多这种数亿PV的网站肯定受不了
使用 Bitset
我们知道,对于一个32位的int,如果我们只用来记录id,那么只能够记录一个用户,但如果我们转成2进制,每位用来表示一个用户,那么我们就能够一口气表示32个用户,空间节省了32倍!对于有大量数据的场景,如果我们使用bitset,那么,可以节省非常多的内存。对于没有登录的用户,我们也可以使用哈希算法,把对应的用户标识哈希成一个数字id。bitset非常的节省内存,假设有1亿个用户,也只需要100000000/8/1024/1024约等于12兆内存。
520,送一波高质量Java经典图书!一定有你想要还没入手的!
Redis已经为我们提供了SETBIT 的方法,使用起来非常的方便,我们可以看看下面的例子,我们在item页面可以不停地使用SETBIT 命令,设置用户已经访问了该页面,也可以使用GETBIT 的方法查询某个用户是否访问。最后我们通过BITCOUNT 可以统计该网页每天的访问数量。
Git 这样回退代码,才足够优雅
优点 占用内存更小,查询方便,可以指定查询某个用户,数据可能略有瑕疵,对于非登录的用户,可能不同的key映射到同一个id,否则需要维护一个非登录用户的映射,有额外的开销。
缺点 如果用户非常的稀疏,那么占用的内存可能比方法一更大。
使用概率算法
对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法,事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。在Redis中,已经封装了HyperLogLog算法,他是一种基数评估算法。这种算法的特征,一般都是数据不存具体的值,而是存用来计算概率的一些相关数据。
字节跳动涉代码抄袭被诉陪22.74亿,连错误的函数都搬?
当用户访问网站的时候,我们可以使用PFADD 命令,设置对应的命令,最后我们只要通过PFCOUNT 就能顺利计算出最终的结果,因为这个只是一个概率算法,所以可能存在0.81%的误差。
优点 占用内存极小,对于一个key,只需要12kb。对于拼多多这种超多用户的特别适用。
缺点 查询指定用户的时候,可能会出错,毕竟存的不是具体的数据。总数也存在一定的误差。
好了,上面就是常见的3种适用Redis统计网站用户访问数的方法了。
往期推荐
Spring越来越强,而我们越来越快餐!离开了Spring,居然API都写不出来了!
字节跳动涉代码抄袭被诉陪22.74亿,连错误的函数都搬?
JDK 8 Stream 数据流效率怎么样?
如何设计 QQ、微信、微博、Github 等第三方账号登陆 ?(附表设计)
为什么要重构?如何重构?这个宝典请一定收藏!
如果你喜欢本文,欢迎关注我,订阅更多精彩内容
关注我回复「加群」,加入Spring技术交流群
Spring For All社区3.0开始测试啦!
学习的路上不孤单,快来注册分享与交流吧!
点击阅读原文直达新版社区
喜欢的这里报道
↘↘↘
拼多多面试真题:如何用 Redis 统计独立用户访问量!相关推荐
- 拼多多面试:如何用 Redis 统计独立用户访问量?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:沙茶敏碎碎念 来源:https://url.cn/5tQPE ...
- 拼多多面试|如何用 Redis 统计独立用户访问量?
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer 当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...
- 拼多多的真实面试题:数亿的用户,如何用Redis统计独立用户访问量
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...
- discuz设置用户每天回帖数_如何用Redis统计独立用户访问量,除了Hash跟Bitset,还有这个...
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...
- Java算法:牛客网拼多多笔试真题算法Java版1-13题
题号 题目 知识点 难度 通过率 PDD1 最大乘积 贪心模拟 中等 14.45%PDD2 大整数相乘 模拟 中等 27.32%PDD3 六一儿童节 贪心 中等 24.74%PDD4 迷宫寻路 模拟 ...
- 2018 拼多多 校招真题 最大乘积
最大乘积 时间限制:1秒 空间限制:32768K 热度指数:8197 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE. 题目描述 给定一个无序数组,包含正数. ...
- 【数据攻略】字节面试真题(含答案)+100道面试题库
整理了一套字节的面试真题,还有100道PDF版的面试题库 一.SQL题 面试真题1: 抖音电商平台,现有一张订单表(order_info),有以下字段: order_id goods_id order ...
- 字节跳动面试真题:Redis为什么快?
前言 大家好,有位伙伴面试了字节(四年半工作经验),分享下面试真题,大家一起加油哈. 说说Redis为什么快 Redis有几种数据结构,底层分别是怎么存储的 Redis有几种持久化方式 多线程情况下, ...
- 高频面试真题答案 -java后端 -Redis篇
原贴: 2022届秋招高频面试真题汇总,千题奉送!!!- 后端篇_笔经面经_牛客网 整理答案: Redis问题与解决方案 缓存穿透.缓存雪崩原因及解决方案 36 Redis缓存与如何保证数据一致性问题 ...
最新文章
- 利用神经网络 遗传算法求得函数极小极大值
- 【UOJ】67 新年的毒瘤 【BZOJ】1123 BLO
- linux复制目录命令夹,linux复制目录(文件夹)和打包命令
- JsonPath工具类封装
- winapi编程获取文件版本信息的代码_.Net调用WinAPI轻松实现POS小票并口打印
- Gatech OMSCS的申请和学习之奥妙
- php访问属性两种方式,使用PHP访问对象的属性
- java三角函数计算器_java 计算器代码能实现三角函数和阶乘功能
- 苹果关掉200m限制_苹果手机200m限制取消教程 苹果怎么下载超过200m的软件
- Python-Opencv激光测距
- 移动端300ms延迟_移动端300ms延迟的解决方法
- vmware workstation虚拟机安装Debian系统教程
- 远程手机教学|简单实用,1键远程协助老人使用智能手机
- upupoo启动不了 mysql_【upupoo动态桌面壁纸和MySQL API 中文手册哪个好用】upupoo动态桌面壁纸和MySQL API 中文手册对比-ZOL下载...
- 数据库拆分的理解和案例(详细版)
- 2018最新苹果公司开发者账号设置税务
- ​透过享云链白皮书 看到开启云计算更大一扇门
- 你需要了解的 http 协议基础知识
- 迅为开发板4412开发板-ANROID系统的烧写方法分享
- CS144课程实验详解-lab0-第一部分