首页 文章 精选 留言 我的

精选列表

搜索[面试],共5092篇文章
优秀的个人博客,低调大师

面试官问你如何解决web高并发这样回答就好了

所谓高并发,就是同一时间有很多流量(通常指用户)访问程序的接口、页面及其他资源,解决高并发就是当流量峰值到来时保证程序的稳定性。 我们一般用QPS(每秒查询数,又叫每秒请求数)来衡量程序的综合性能,数值越高越好,一般需要压测(ab工具)得到数据。 假设我们的一个进程(也可以是线程或者协程)处理一次请求花费了50毫秒(业内达标范围一般是20毫秒至60毫秒),那么1秒钟就可以处理20个请求,一台服务器是可以开很多这样的进程并行去处理请求的,比如开了128个,那么这台机器理论上的QPS=2560。 千万不要小瞧这个数字,当你的QPS真有这么高的时候意味着你的DAU(用户日活)有2560*200=51.2万,业内一般是放大200倍计算,有这样的日活说明做得很不错了。 一台服务器能够达到的最大QPS受很多因素的影响,比如机器参数配置、机房地理位置、CPU性能、内存大小、磁盘性能、带宽大小、程序语言、数据库性能、程序架构等,我们一一细说。 推荐一个交流学习群:614478470 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多 点击:加入 1.机器参数配置 这个很好理解,比如服务器最大可以开启128个进程,你设置了最大只开启100个,这属于服务器调优。 2.机房地理位置 如果你做海外用户,服务器机房应该选择国外的,反之应该选择国内的,因为机房距离用户越近,在传输上的时间损耗就越低。 3.CPU性能 CPU性能越好,处理速度就越快,核心数越多,能够并行开启的进程就越多。 4.内存大小 内存越大,程序就能把更多的数据直接放到内存,从内存读取数据比从磁盘读取数据的速度快很多。 5.磁盘性能 这个不用多说吧,一般固态硬盘的性能比机械硬盘的性能好很多,性能越好读写数据的速度就越快。 6.带宽大小 服务器的带宽一般指流出带宽,单位为Mb/S,比如带宽为8Mb/S即1MB/S,如果提供文件下载服务,可能一个用户的下载行为就把服务器带宽用完了。 一般把图片、视频、css文件、JavaScript脚本等资源放到第三方的CDN去,按流量计费,这样就不占用服务器带宽了。 如果用户规模小,基本上一台服务器就好了,这个时候一般会选按固定带宽大小计费。 如果用户规模很大了,基本上会用到负载均衡器来分流,即把流量按照一定的规则分配到不同的服务器上,负载均衡器一般会按流量来计费。 如果平均一次请求返回的数据大小为50KB,为了达到1000QPS这个指标,需要的带宽峰值=1000*50*8/1024=390.625Mb/S。 我们在设计接口的时候应该尽量减少返回的数据大小,比如user_id就可以简化为uid,像图片、视频、css等文件压缩的目的就是减少数据的大小。 7.程序语言 编译型语言的性能一般好于解释型语言的性能,比如go语言性能就好于php语言性能,当语言短期不会替换时,可以通过堆机器解决高并发问题。 8.数据库性能 一台服务器上部署的数据库总是有一个瓶颈的,比如每秒查询数、每秒写入数。 我们可以通过增加很多从库解决查询(select语句)的瓶颈,称之为多从库模型,需要注意的是主从同步数据可能有延迟,当修改数据后马上需要查询时需要设置强制从主库读取。 我们可以将业务拆分,让某些表存储在一个数据库实例上,另一些表存储在其他数据库实例上,虽然一个数据库实例有自己的瓶颈,但是很多的数据库实例堆积起来性能就会大大改善,多个数据库实例的方案称之为多主库模型,主要是为了解决写入瓶颈(insert语句、update语句、delete语句)。 如果你有多个主库又有多个从库,你就实现了多主多从模型。 如果一个表存储的数据量很大,这个时候就要考虑分表了(一般用中间件实现),比如按时间分表或者按用户分表,当把一个表的所有分表都放在一个数据库实例上都满足不了要求的时候,你应该把某些分表存储在新的数据库实例上,这个时候一个表的数据分布到了不同的数据库实例上,这就是所谓的分布式数据库方案了,你需要处理的事情就很复杂了,比如处理分布式事务。 数据库的并发连接数也是有限制的,我们可以用连接池技术来应对,就是保持一定数量的和数据库的连接不断开的长连接,需要连接数据库的时候就从池子里选择一个连接,用完放回去就好了,这个一般也是用中间件来实现。 好的索引也能提高数据库的性能,有时候比堆多个从库的方案还要好。 如果能够减少数据库的读写,也算间接提高了数据库的性能,比如我们用redis来做缓存,用消息队列异步落库等。 有时候某些数据用数据库来计算需要很长时间,可以取到元数据(最小粒度的数据)用程序来计算,这称之为用内存换时间。 9.程序架构 比如实现同样的功能,初级程序员写的程序需要循环100次,而高级程序员写的程序只需要循环10次,效果肯定不一样。 总结 一般大型项目基本是前后端分离的,从性能方面说就是为了将页面渲染的处理在客户端运行,降低服务器的压力。 从带宽层面考虑,css、图片、视频、JavaScript等文件资源能用CDN的就用CDN,能压缩的就尽量压缩,接口能减小返回数据的大小就尽量减小。 为了解决编程语言的不足或者单台服务器的瓶颈,可以先堆机器应对。 索引、多主多从、分布式数据库、缓存、连接池、消息队列等是从数据库方便考虑如何优化性能。 有时候程序的低耦合性比程序的高性能更重要,不要一味地追求高性能。 推荐一个交流学习群:614478470 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多 点击:加入

优秀的个人博客,低调大师

程序员面试,什么样的 GitHub 才适合放简历上?

为什么 GitHub 可以加分 很多招聘描述上面都会备注 GitHub 加分项,那么为什么它是加分项呢? 社区光环,众所众知,GitHub 是开发者的“同性交友社区”。Google、Facebook、Alibaba 都在通过它来贡献自己的开源项目。如果你留心关注,公司越大 GitHub 的贡献度越高,那么如果你想进入大的互联网公司,是不是也提前融入一下这个氛围?同时对于求知的小伙伴儿想阅读源码没有什么比它来的更直接了。 代码工具,基本上 90% 以上的公司都使用 Git 系工具(GitLab、Gitee、GitHub)做项目源码管理,你的提交记录是最好的证明你的 Git 基本功,要比在简历上写熟练使用 Git 更有说服力。那么一个题外话,如果你也热衷于维护 StackOverflow 账号,写上也是一种加分。 编程习惯, 『Talk is

优秀的个人博客,低调大师

学习Java基础知识,打通面试关~十二接口与抽象类

在我们Java开发的过程中,接口使我们经常使用到。但是我们也会用到抽象类。那么我们在开发的时,具体应该怎么选择呢?这两者有什么区别?我们今天就来学习下。 抽象类 抽象类顾名思义就是不能实例化的类,我们在创建的时候会使用abstract 来创建。在抽象类中含有无具体实现的方法,所以我们在使用的时候不能使用该类来创建对象。 抽象类在表面上普通的类没有区别,可以有多个抽象方法,当然也可以没有抽象方法。 抽象类的实现主要是为了提供代码复用的目的。 抽象类前面的修饰除了abstract ,还有有public,protected,缺省情况下是public。不能是private.不然子类不能继承父类。 我们子类在继承抽象类时,子类必须实现父类的抽象方法,否则 ,子类也必须定义为抽象类。 public abstract class Abstorct { //方法声明为抽象的。 public abstract void add(); } public class AbstorctImpl extends Abstorct { @Override public void add() { } } 接口 编程中,接口我们经常使用,利用它达到API定义与实现分离的目的。 在Java中,是没有多继承这一实现的,但是我们可以使用接口来达到这个目的。方便我们去实现我们想要的目的。 接口中的变量总是被隐式指定为public static final 变量。 并且方法也是被隐式的定义为public abstract。接口中的方法必须都是抽象方法。 在java8以后,接口中也有了默认的实现方法。 //java集合中一个默认实现的方法。 public interface Collection<E> extends Iterable<E> { default boolean removeIf(Predicate<? super E> filter) { Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; } } 两者不同点 两者一个是类一个是接口,从子类来实现或者继承时,实现就不同,继承类java中只能单继承。 抽象类是事务的抽象,比如我们对于一个动物的描述,人和猴都有相似的东西,可以抽象出来共同的特征。 抽象类 是一个 has-a的关系。接口是is-a的关系。比如猴是否能跳,能跳跃,那么就能实现该接口,不能实现则不能实现。 接口中不能含有静态代码块和静态方法,但是抽象类是可以存在静态代码块和静态方法的。 接口中的成员变量默认是public static final 类型的。抽象函数中的成员可以是各个类型的。 我们在程序中如果对接口进行增加方法,那么子类实现也得增加其实现方法 不可取,但是java8以后增加了默认方法的实现。而抽象类中添加了非抽象方法,子类只会享受其能力的扩展,不用担心编译出现问题。 简单了解下抽象方法和接口,让我们在编程的时候更加享受其特性带来的方便。在选择上可以有更多的选择。 原文发布时间为:2018-07-01本文作者:mengrui本文来自云栖社区合作伙伴“LuckQI”,了解相关信息可以关注“LuckQI”。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册