尚硅谷Java技术之深圳高频面试题
版本:V1.0
尚硅谷Java技术中心
一般情况下,给客户定制的项目这些数据是拿不到的,项目给客户做的,甲方客户的运营数据是拿不到的。
但是要了解以下数据关键词:
(1)QPS(TPS):每秒钟request/事务数量
(2)并发数:系统同时处理的request/事务数
(3)响应时间:一般取平均响应时间
如果非要说,以下提供一套参数,但是仅供参考,可以根据自己设计适当调整:
用户总量 10w+
日活 5000+
月活 12W+
一个月PV 60W+
并发量 2000+
以下参数仅供参考,可以根据自己的设计进行调整,只要说的合理即可。
配置;整个组里是7个后台 3个测试 两个设计 两个前端 1个渲染 3个ios
周期:版本迭代 第一版从定需求到测完6个月吧
这道题也没有标准答案,可以根据自己情况进行设计,只要合理即可,以下提供几个样例:
(1)开发 SpringBoot 接口出现客户端和服务端不同步,导致接口无法测试,产
生的原因沟通不畅。
(2)订单提交时由于本地 bug 或者意外故障导致用户钱支付了但是订单不成功,
采用对账方式来解决。
(3)上线的时候一定要把支付的假接口换成真接口。
(4)项目中用到了曾经没有用过的技术,解决方式:用自己的私人时间主动学
习
(5)在开发过程中与测试人员产生一些问题,本地环境 ok
但是测试环境有问题,
环境的问题产生的,浏览器环境差异,服务器之间的差异
(6)系统运行环境问题,有些问题是在开发环境下 OK,但是到了测试环境就问
题,比如说系统文件路径问题、导出报表中的中文问题(报表采用 POI),需要
在系统 jdk 中添加相应的中文字体才能解决;
1.根据状态机很多时候业务表是有状态的,比如订单表中有:1-下单、2-已支付、3-完成、4-撤销等状态。如果这些状态的值是有规律的,按照业务节点正好是从小到大,我们就能通过它来保证接口的幂等性。假如id=123的订单状态是已支付,现在要变成完成状态。update
`order` set status=3 where id=123 and
status=2;第一次请求时,该订单的状态是已支付,值是2,所以该update语句可以正常更新数据,sql执行结果的影响行数是1,订单状态变成了3。后面有相同的请求过来,再执行相同的sql时,由于订单状态变成了3,再用status=2作为条件,无法查询出需要更新的数据,所以最终sql执行结果的影响行数是0,即不会真正的更新数据。但为了保证接口幂等性,影响行数是0时,接口也可以直接返回成功。
具体步骤:
1 用户通过浏览器发起请求,服务端收集数据。
2 根据id和当前状态作为条件,更新成下一个状态
3 判断操作影响行数,如果影响了1行,说明当前操作成功,可以进行其他数据操作。
4 如果影响了0行,说明是重复请求,直接返回成功。
主要特别注意的是,该方案仅限于要更新的表有状态字段,并且刚好要更新状态字段的这种特殊情况,并非所有场景都适用。
2.加分布式锁其实前面介绍过的加唯一索引或者加防重表,本质是使用了数据库的分布式锁,也属于分布式锁的一种。但由于数据库分布式锁的性能不太好,我们可以改用:redis或zookeeper。鉴于现在很多公司分布式配置中心改用apollo或nacos,已经很少用zookeeper了,我们以redis为例介绍分布式锁。目前主要有三种方式实现redis的分布式锁:
1 setNx命令
2 set命令
3 Redission框架
具体步骤:
1 用户通过浏览器发起请求,服务端会收集数据,并且生成订单号code作为唯一业务字段。
2 使用redis的set命令,将该订单code设置到redis中,同时设置超时时间。
3 判断是否设置成功,如果设置成功,说明是第一次请求,则进行数据操作。
4 如果设置失败,说明是重复请求,则直接返回成功。
3. 获取token
除了上述方案之外,还有最后一种使用token的方案。该方案跟之前的所有方案都有点不一样,需要两次请求才能完成一次业务操作。
第一次请求获取token
第二次请求带着这个token,完成业务操作。
具体步骤:
1 用户访问页面时,浏览器自动发起获取token请求。
2 服务端生成token,保存到redis中,然后返回给浏览器。
3 用户通过浏览器发起请求时,携带该token。
4 在redis中查询该token是否存在,如果不存在,说明是第一次请求,做则后续的数据操作。
5 如果存在,说明是重复请求,则直接返回成功。
6 在redis中token会在过期时间之后,被自动删除。
这个建议提前去了解几种常见的设计模式及其应用场景,将其套用到项目的某个场景中,以下提供几种常见的设计模式及其应用场景
1) 单例模式。
单例模式是一种常用的软件设计模式。
在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
2) 工厂模式。
工厂模式主要是为创建对象提供了接口。
应用场景如下:
a、 在编码时不能预见需要创建哪种类的实例。
b、 系统不应依赖于产品类实例如何被创建、组合和表达的细节。
3) 策略模式。
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
应用场景如下。
a、 一件事情,有很多方案可以实现。
b、我可以在任何时候,决定采用哪一种实现。
c.、未来可能增加更多的方案。
d、 策略模式让方案的变化不会影响到使用方案的客户。
举例业务场景如下。
系统的操作都要有日志记录,通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面。日志写到数据库与文件中是两种算法,但调用方不关心,只负责写就是。
4) 观察者模式。
观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
应用场景如下:
a、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
b、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
5) 迭代器模式。
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
应用场景如下:
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍
历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
6) 模板方法模式。
模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
应用场景如下:
对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。
生产环境出问题一般由多方面引起,可以由多方面进行排查,可以借鉴以下链接文章进行参考,面试的时候只需提出大概的思路即可:
https://blog.csdn.net/GitChat/article/details/79019454
引发OutOfMemoryError的常见原因有以下几种:
1. 内存bai中加载的数据量过于庞大,如一次从数据库取出过多数据。
2. 集合类中有对对象的引用,使用完后未清空,dao使得JVM不能回收。
3. 代码中存在死循环或循环产生过多重复的对象实体。
4. 启动参数内存值设定的过小。
排查:可以通过jvisualvm进行内存快照分析,参考https://www.cnblogs.com/boboooo/p/13164071.html
在实际开发中,一个项目的开发流程大概分为以下几个阶段:
1. 需求阶段
项目前期主要指的是项目业务需求调研、包括配合用户制定项目建设方案、技术规范书、配合市场人员进行售前技术交流等环节,此阶段应该组织由售前工程师、需求分析师以及系项目经理等组成一个临时小组,负责跟踪项目。这个小组根据项目的大小和客户的要求确定小组成员。
项目前期小组的工作是项目的开始,这个小组工作成绩的优劣、工作质量的高低,将直接影响项目的成败。因此,从管理层的角度,一定要重视这个环节。
项目前期小组需要完成的工作包括以下方面:
1) 客户的各种项目前期要求,如:方案介绍、业务需求编写等
2) 提交项目可行性分析报告,包括成本/效益分析
3) 提交项目建议方案
4) 提交业务需求说明书或需求分析说明书
2. 设计阶段
系统设计是决定项目或软件系统"怎样做"的过程,这个过程回答了系统应该如何实现的问题。从软件工程的角度,设计阶段大约是整个项目开发成本的25%,所以,设计团队以及该团队的工作成绩对于整个系统来说至关重要。
人员需求设计团队一般由3—8名设计人员组成,从这个阶段起,项目需要一名项目经理,行使项目组的各种管理职能。设计团队的成员具体包括:
1名项目经理
包括1—2名项目前期成员
1名系统构架师
1名数据库设计人员
1名用户界面设计人员组成
设计团队需要完成的工作包括:
1) 项目开发计划
2) 确定系统软硬件配置最佳方案
3) 确定系统开发平台以及开发工具
4) 确定系统软件结构
5) 确定系统功能模块以及各个模块之间的关系
6) 确定系统测试方案
7) 提交系统数据库设计方案
8)
提交系统概要设计文档由于应用软件需求经常变化,因此设计需要考虑系统可扩展性,并需要在设计过程中对于重要的环节和用户进行及时沟通。
3. 开发阶段
将用户的需求变成真正可用的软件系统,是通过编码和系统实现阶段来完成的。虽然软件的质量主要取决于系统设计的质量,但是编码的途径和实现的具体方法对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。
人员需求:
这个阶段要根据用户对项目进度的要求灵活组织开发团队。为了工作的连贯性,同时也为了解决在开发过程中用户需求有可能变化的因素,开发团队应该保留1—3名设计团队的成员。
人员分工:
开发过程中,项目经理的角色非常重要,项目经理负责项目组开发人员的日常管理,控制项目的进度,负责和设计部门、市场部门以及客户之间进行必要的沟通。这个阶段通常是多个部门的人员共同组成一个项目组,因此,项目管理的一定要保证统一管理,理想状态是项目经理全权负责项目组人员的人员工作安排、业绩考核、工资奖金等,因为项目经理最了解项目组成员的工作态度和工作业绩。
一般在大型项目开发团队中,应该设立专门的技术经理岗位,负责对项目组的技术方案进行管控,技术经理最好是由设计团队中抽调出来。技术经理在项目开发过程中需要注意程序风格、编码规范等问题,并必须进行有效的代码管理(版本管理)。
开发过程还应该进行系统的单元测试工作,确保各个独立模块功能的正确性和性能满足需求说明书的要求。
开发团队应该完成的工作包括:
1) 系统的实现代码编写
2) 单元测试
3) 提交源代码清单
4) 提交单元测试报告
4. 测试阶段
这个阶段测试人员会针对系统进行各方面测试,总的来说有以下几方面:
1) 功能测试
2) 安全测试
3) 压力测试
5. 部署实施
由于从事的应用软件的开发,因此,在开发完成之后经常会有系统集成、软件的安装等工作。这个阶段还经常伴随着新的业务需求和本地化需求的产生,因此将会有一部分的开发工作需要在这个阶段完成。
相关文章:
第一章 Java基础
第二章 MySQL相关
第三章 框架相关
第四章 Redis相关
第五章 JVM相关
第六章 消息队列相关
第七章 项目相关
真诚点赞 诚不我欺~
{{ praiseUserVoList.length }}人点赞
内容
"{{ child.parent.content }}"