面试题分析:统计网站访问次数

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 平台的访问量非常高,需要实时统计网站的访问次数,请设计一个计数器解决:初级工程师,可能回答使用synchronized锁或重入锁,进一步探讨,synchronized锁太重,有没其他方式,可能回答atomic类,进一步问,atomic类原理,什么场景下适合用,什么场景下不适合用atomic和synchronized都是单机方案,当一个服务器不能满足性能要求时,线上使用集群,如何在集群场景下实现计数器

难度:较低

  • 平台的访问量非常高,需要实时统计网站的访问次数,请设计一个计数器解决:
  • 初级工程师,可能回答使用synchronized锁或重入锁,进一步探讨,synchronized锁太重,有没其他方式,可能回答atomic类,进一步问,atomic类原理,什么场景下适合用,什么场景下不适合用
  • atomic和synchronized都是单机方案,当一个服务器不能满足性能要求时,线上使用集群,如何在集群场景下实现计数器
  • 可能回答在DB中计数,则问,如何避免更新丢失,即A和B两个线程同时读取当前计数,加1后更新DB,出现更新丢失
  • 可能回答使用redis原子操作incr,则问当访问量极大,不能满足性能需求,如何做sharding,考虑一致性hash
  • 面试者,不仅是回答问题,还可以探讨,所谓的实时统计,要求的精度是多高,如果有延迟10-20秒的误差,是否可接受,若可接受,还有其他哪些方案能达到高性能和高可用

方案分析

网站访问量统计功能大多是分布式集群情况下,才需要进行统计,如果当前系统只有一台机器,通过AOP做核心接口的切面拦截就可以实现,考虑的难点也很少。

在集群模式下,使用redis存储统计数据是可行的,但随之而来的成本问题和性能问题就需要考虑。

  1. 成本问题:当一个网站访问量较大时,如QPS达到1w/s时,每次请求都需要调用redis进行计数累加。这里无疑会加重redis负担,单机redis无法保证和支持需求,从而又需要引入集群版redis来保证服务可靠性、可用性,这又增加系统复杂度,增加开发成本运维成本。

  1. 性能问题:每次接口请求都调用redis的话,相当于接口整体耗时都要增加,虽然redis一次请求也就5ms左右,但对于整体接口提高一定耗时来增加一个不算是关键功能的业务,并不太划算,还是有很大的优化空间。

  1. 一致性问题:综合上面两个问题,势必需要采用集群版redis,而接口统计也不能每次都进行累积,可以通过异步或定时/定量的方式进行统计,例如优先完成接口处理,然后再通过异步线程池的方式统计,异步的时候也并不一定每次都统计,可以间隔2s,5s进行数据统计,或者达到100次,500次这样的阈值再统计,这样能提升接口性能,减轻redis集群压力,但也有了新的问题,数据不一致了,或者说这一秒的统计量并不是真正的访问量。

Redis方案:

拆分统计key,数十台服务器同时访问更新一个redis-key不如根据不同服务器地址特征来进行拆分,每台服务器修改自己对应的key,在汇总统计功能里,遍历所有的key列表来累加所有访问量,也可以得到实时的访问统计。

上面的方案还是存在对redis大量请求的问题,可以创建一个异步线程池用来请求redis进行数据上报,每台服务器的接口使用变量来记录接口访问量,当达到100次时创建一个统计任务,提交到线程池中进行处理,阈值越大对接口的性能影响越小,同样的数据不一致性越高。

nginx方案

正常网站请求都会通过nginx作为前端请求入口,nginx会记录每次访问日志,可以通过在每台服务器上挂日志脚本的形式来分析日志数据,或者直接监控日志文件变更内容,也可以实时的上报统计数据,并且不侵入现有服务,对当前服务接口没有影响。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
JavaScript 前端开发
【面试题】Vue2为什么能通过this访问到data、methods的属性或方法
【面试题】Vue2为什么能通过this访问到data、methods的属性或方法
|
10天前
|
存储 缓存 NoSQL
希音面试:亿级用户 日活 月活,如何统计?(史上最强 HyperLogLog 解读)
本文详细介绍了如何使用Redis的各种数据结构(如Set、Bitmap、HyperLogLog)来统计网站的日活(DAU)和月活(MAU)用户数。作者通过实际案例和代码示例,系统地讲解了这些数据结构的原理和应用场景,特别是HyperLogLog在处理亿级用户数据时的优势。文章还深入解析了HyperLogLog的数学原理和底层数据结构,帮助读者更好地理解和应用这一高效的数据统计工具。此外,文章还提供了多个相关面试题和参考资料,适合准备面试的技术人员阅读。
|
1月前
|
Kubernetes 架构师 算法
阿里面试:全国14亿人,统计出重名最多的前100个姓名
文章介绍了如何解决“从全国14亿人的数据中统计出重名人数最多的前100位姓名”的面试题,详细分析了多种数据结构的优缺点,最终推荐使用前缀树(Trie)+小顶堆的组合。文章还提供了具体的Java代码实现,并讨论了在内存受限情况下的解决方案,强调了TOP N问题的典型解题思路。最后,鼓励读者通过系统化学习《尼恩Java面试宝典》提升面试技巧。
阿里面试:全国14亿人,统计出重名最多的前100个姓名
|
3月前
|
Java
【Java基础面试三】、说一说你对Java访问权限的了解
这篇文章介绍了Java中的四种访问权限:private、default(无修饰符时的访问权限)、protected和public,以及它们分别在修饰成员变量/方法和类时的不同访问级别和规则。
【Java基础面试三】、说一说你对Java访问权限的了解
|
3月前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
89 4
|
4月前
|
监控 Java 开发者
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
202 2
|
4月前
|
算法 Java API
Android性能优化面试题经典之ANR的分析和优化
Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作
65 3
|
4月前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
63 0
|
4月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
107 0
|
4月前
|
Java
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
28 0