作者 | 沙茶敏碎碎念

来源 | 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 统计独立用户访问量!相关推荐

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

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

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

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

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

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

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

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

  5. Java算法:牛客网拼多多笔试真题算法Java版1-13题

    题号 题目 知识点 难度 通过率 PDD1 最大乘积 贪心模拟 中等 14.45%PDD2 大整数相乘 模拟 中等 27.32%PDD3 六一儿童节 贪心 中等 24.74%PDD4 迷宫寻路 模拟 ...

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

    最大乘积 时间限制:1秒 空间限制:32768K 热度指数:8197 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE. 题目描述 给定一个无序数组,包含正数. ...

  7. 【数据攻略】字节面试真题(含答案)+100道面试题库

    整理了一套字节的面试真题,还有100道PDF版的面试题库 一.SQL题 面试真题1: 抖音电商平台,现有一张订单表(order_info),有以下字段: order_id goods_id order ...

  8. 字节跳动面试真题:Redis为什么快?

    前言 大家好,有位伙伴面试了字节(四年半工作经验),分享下面试真题,大家一起加油哈. 说说Redis为什么快 Redis有几种数据结构,底层分别是怎么存储的 Redis有几种持久化方式 多线程情况下, ...

  9. 高频面试真题答案 -java后端 -Redis篇

    原贴: 2022届秋招高频面试真题汇总,千题奉送!!!- 后端篇_笔经面经_牛客网 整理答案: Redis问题与解决方案 缓存穿透.缓存雪崩原因及解决方案 36 Redis缓存与如何保证数据一致性问题 ...

最新文章

  1. 利用神经网络 遗传算法求得函数极小极大值
  2. 【UOJ】67 新年的毒瘤 【BZOJ】1123 BLO
  3. linux复制目录命令夹,linux复制目录(文件夹)和打包命令
  4. JsonPath工具类封装
  5. winapi编程获取文件版本信息的代码_.Net调用WinAPI轻松实现POS小票并口打印
  6. Gatech OMSCS的申请和学习之奥妙
  7. php访问属性两种方式,使用PHP访问对象的属性
  8. java三角函数计算器_java 计算器代码能实现三角函数和阶乘功能
  9. 苹果关掉200m限制_苹果手机200m限制取消教程 苹果怎么下载超过200m的软件
  10. Python-Opencv激光测距
  11. 移动端300ms延迟_移动端300ms延迟的解决方法
  12. vmware workstation虚拟机安装Debian系统教程
  13. 远程手机教学|简单实用,1键远程协助老人使用智能手机
  14. upupoo启动不了 mysql_【upupoo动态桌面壁纸和MySQL API 中文手册哪个好用】upupoo动态桌面壁纸和MySQL API 中文手册对比-ZOL下载...
  15. 数据库拆分的理解和案例(详细版)
  16. 2018最新苹果公司开发者账号设置税务
  17. ​透过享云链白皮书 看到开启云计算更大一扇门
  18. 你需要了解的 http 协议基础知识
  19. 迅为开发板4412开发板-ANROID系统的烧写方法分享
  20. CS144课程实验详解-lab0-第一部分

热门文章

  1. 2440从sd卡启动wince
  2. Java 常用API的运用,效率及技巧
  3. 在.NET环境下将报表导出Excel和Word
  4. rabbitmq beam.smp cpu利用率过高
  5. python3 异步 asyncio 动态添加任务
  6. linux watch 命令简介 监测 监控变化
  7. mysql order by 多字段排序
  8. KVM-Qemu-Libvirt三者之间的关系
  9. 解决警告inconsistent dll linkage
  10. 驱动保护中的ObjectType_Callback探索