面试:第四章:项目介绍,java泛型面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

普通商品只有在发货时才去更新库存,如果库存不足商家会马上补货

秒杀的商品会在客户下单时就减库存,如果在规定时间(半个小时)没有付款,会取消此订单把库存还原。

秒杀系统中如何防止超售?如何避免脚本进行恶意刷单?

=====================================

防止超售解决方案:将存库从MySQL前移到Redis中,所有的写操作放到内存中,由于Redis中不存在锁故不会出现互相等待,并且由于Redis的写性能和读性能都远高于MySQL,这就解决了高并发下的性能问题。然后通过队列等异步手段,将变化的数据异步写入到DB中。当达到库存阀值的时候就不在消费队列,并关闭购买功能。避免脚本恶意刷单:采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。

单点登录你们是自己编写的还是使用通用的CAS?

===================================

项目使用通用的CAS框架。

什么是CAS?

=======

中央认证服务,企业级单点登录解决方案。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。

如果一个用户的token被其他用户劫持了,怎样解决这个安全问题。

============================================

a、在存储的时候把token进行对称加密存储,用时解开。

b、将请求URL、时间戳、token三者进行合并加盐签名,服务端校验有效性。

c.HTTPS对URL进行加密

对系统运行造成很大压力,随着项目上线时间增长,压力会越来越大,我们怎么减轻系统访问压力

===========================================

流量分为三种,一种是商家流量,另一种是用户流量,第三种运营商流量。

解决方案:

这三种流量对系统运行造成很大压力,随着项目上线时间增长,压力会越来越大,因此我们要减轻系统访问压力 ,就需要做一系列优化措施。

具体优化如下:

数据层面的优化:

从数据库层面做优化,比如:索引,缓存集群双缓存,把查询独立出来读写分离,配置数据库集群主从复制,使用Mycat分表,分库。

从数据库设计层面的优化:比如减少表关联,加入冗余字段

从缓存方面优化:比如redis实现数据缓存,减轻数据库压力

从搜索上进行优化:比如查找索引库,使用es或solr全文搜索

项目层面的优化:

采用面向服务的分布式架构:分担服务器压力 ,提高项目并发量。比如dubbox+zookeeper的SOA分布式架构

采用分布式文件系统实现海量文件存储:如采用fastdfs实现海量图片存储,提高文件的访问速度。

采用mq使用服务进一步解藕:同步索引库,同步静态资源,短信发送

服务器层面的优化

集群思想的使用:tomcat,zookeeper,redis,mysql等

Tomcat异步通信的使用,tomcat连接池配置

秒杀和团购业务实现思路

=======================

将商品数量查询出存入到redis中,所有用户下单后,减掉redis中的数量

如果并发量很大时,还要考虑高并发问题,所以可以加入mq消息中间件处理抢单问题,再结合redis实现库存减少操作。高并发方面还可以考虑CDN,Nginx负载均衡等

你们项目中使用的安全框架是什么**?******

====================================

第一种:使用springSecurity

第二种:使用shiro(配置一下再用一下标签就行了),校验用户登录和用户权限!

项目中使用到的应用服务器是什么**?******

====================================

Tomcat+nginx

项目中遇到什么问题?

==========

ES高亮不能显示的问题

前台使用angularJS加载搜索结果,但是发现高亮不能展示。

问题原因:angularJS底层使用ajax,异步加载高亮信息返回给页面后,页面没有刷新,就直接显示返回的数据。此时会把所有的数据作为普通的文本数据进行加载。因此就没有高亮的效果。

解决方案:使用angularJS过滤器过滤文本数据,此时angularJS过滤器把html文本数据解析为浏览器能识别的html标签。高亮就能展示了。

activeMQ存在运行时间长了以后,收不到消息的现象。时间长了就会出现,卡死,新的数据不能从队列接听到。只能重启程序。

============================================================

解决方案:

1)不要频繁的建立和关闭连接:JMS使用长连接方式,一个程序,只要和JMS服务器保持一个连接就可以了,不要频繁的建立和关闭连接。频繁的建立和关闭连接,对程序的性能影响还是很大的。这一点和jdbc还是不太一样的。

2)Connection的start()和stop()方法代价很高:JMS的Connection的start()和stop()方法代价很高,不能经常调用。我们试用的时候,写了个jms的connection pool,每次将connection取出pool时调用start()方法,归还时调用stop()方法,然而后来用jprofiler发现,一般的cpu时间都耗在了这两个方法上。

3)start()后才能收消息:Connection的start()方法调用后,才能收到jms消息。如果不调用这个方法,能发出消息,但是一直收不到消息。不知道其它的jms服务器也是这样。

4)显式关闭Session:如果忘记了最后关闭Connection或Session对象,都会导致内存泄漏。这个在我测试的时候也发现了。本来以为关闭了Connection,由这个Connection生成的Session也会被自动关闭,结果并非如此,Session并没有关闭,导致内存泄漏。所以一定要显式的关闭Connection和Session。

5)对Session做对象池:对Session做对象池,而不是Connection。Session也是昂贵的对象,每次使用都新建和关闭,代价也非常高。而且后来我们发现,原来Connection是线程安全的,而Session不是,所以后来改成了对Session做对象池,而只保留一个Connection。

6) 集群:ActiveMQ有强大而灵活的集群功能,但是使用起来还是会有很多陷阱

activeMQ存在发出消息太大,造成消息接受不成功。多个线程从activeMQ中取消息,随着业务的扩大,该机器占用的网络带宽越来越高。

====================================================================

仔细分析发现,mq入队时并没有异常高的网络流量,仅仅在出队时会产生很高的网络流量。

最终发现是spring的jmsTemplate与activemq的prefetch机制配合导致的问题。

研究源码发现jmsTemplate实现机制是:每次调用receive()时都会创建一个新的consumer对象,用完即销毁。

正常情况下仅仅会浪费重复创建consumer的资源代价,并不至于产生正常情况十倍百倍的网络流量。

但是activeMQ有一个提高性能的机制prefetch,此时就会有严重的问题。

prefetch机制:

每次consumer连接至MQ时,MQ预先存放许多message到消费者(前提是MQ中存在大量消息),预先存 放message的数量取决于prefetchSize(默认为1000)。此机制的目的很显然,是想让客户端代码用一个consumer反复进行 receive操作,这样能够大量提高出队性能。

此机制与jmsTemplate配合时就会产生严重的问题,每次jmsTemplate.receive(),都会产生1000个消息的网络流量, 但是因为jmsTemplae并不会重用consumer,导致后面999个消息都被废弃。反复jmsTemplate.receive()时,表面上看 不出任何问题,其实网络带宽会造成大量的浪费。

解决方案:

1、若坚持使用jmsTemplate,需要设置prefetch值为1,相当于禁用了activeMQ的prefetch机制,此时感觉最健壮, 就算多线程,反复调用jmsTemplate.receive()也不会有任何问题。但是会有资源浪费,因为要反复创建consumer并频繁与服务器进 行数据通信,但在性能要求不高的应用中也不算什么问题。

2、不使用jmsTemplate,手工创建一个consumer,并单线程反复使用它来receive(),此时可以充分利用prefetch机制。配合多线程的方式每个线程拥有自己的一个consumer,此时能够充分发挥MQ在大吞吐量时的速度优势。

切记避免多线程使用一个consumer造成的消息混乱。大吞吐量的应用推荐使用方案2,能够充分利用prefetch机制提高系MQ的吞吐性能。

商品的价格变化后,如何同步redis中数以百万计的购物车数据。

===============================

解决方案:购物车只存储商品id,到购物车结算页面将会从新查询购物车数据,因此就不会涉及购物车商品价格同步的问题。

系统中的钱是如何保证安全的。

==============

在当前互联网系统中钱的安全是头等大事,如何保证钱的安全可以从以下2个方面来思考:

1)钱计算方面

在系统中必须是浮点数计算类型存储钱的额度,否则计算机在计算时可能会损失精度。

2)事务处理方面

在当前环境下,高并发访问,多线程,多核心处理下,很容易出现数据一致性问题,此时必须使用事务进行控制,访问交易出现安全性的问题,那么在分布式系统中,存在分布式事务问题,可以有很多解决方案:

使用 jpa可以解决

使用 tcc 框架可以解决等等。

订单中的事物是如何保证一致性的。

================

使用分布式事务来进行控制,保证数据最终结果的一致性。

讲讲angularJS四大特征?

============================

MVC 模式

Model:数据,其实就是angular变量($scope.XX);

View: 数据的呈现,Html+Directive(指令);

Controller:操作数据,就是function,数据的增删改查;

双向绑定

首先我们要理解数据绑定。我们看到的网站页面中,是由数据和设计两部分组合而成。将设计转换成浏览器能理解的语言,便是html和css主要做的工作。而将数据显示在页面上,并且有一定的交互效果(比如点击等用户操作及对应的页面反应)则是js主要完成的工作。很多时候我们不可能每次更新数据便刷新页面(get请求),而是通过向后端请求相关数据,并通过无刷新加载的方式进行更新页面(post请求)。那么数据进行更新后,页面上相应的位置也能自动做出对应的修改,便是数据绑定。

在以前的开发模式中,这一步一般通过jq操作DOM结构,从而进行更新页面。但这样带来的是大量的代码和大量的操作。如果能在开始的时候,便已经确定好从后端获取的数据到页面上需要进行的操作,当数据发生改变,页面的相关内容也自动发生变化,这样便能极大地方便前端工程师的开发。在新的框架中(angualr,react,vue等),通过对数据的监视,发现变化便根据已经写好的规则进行修改页面,便实现了数据绑定。可以看出,数据绑定是M(model,数据)通过VM(model-view,数据与页面之间的变换规则)向V(view)的一个修改。

而双向绑定则是增加了一条反向的路。在用户操作页面(比如在Input中输入值)的时候,数据能及时发生变化,并且根据数据的变化,页面的另一处也做出对应的修改。有一个常见的例子就是淘宝中的购物车,在商品数量发生变化的时候,商品价格也能及时变化。这样便实现了V——M——VM——V的一个双向绑定。

这里是区别于Jquery的,jq操作的是dom对象,angularJS操作的是变量

依赖注入

对象在创建时,其依赖的对象由框架来自动创建并注入进来。控制器就是通过依赖注入的方式实现对服务的调用。

模块化设计

高内聚低耦合法则

高内聚:每个模块的具体功能具体实现

低耦合:模块之间尽可能的少用关联和依赖

独家面经总结,超级精彩

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

image

image

image

image

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

image

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3393624689)]

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

[外链图片转存中…(img-nSfv8tys-1713393624689)]

[外链图片转存中…(img-pVaU8RNB-1713393624689)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-orQqq7V9-1713393624690)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值