Java开发框架和中间件面试题(10)

目录

104.怎么保证缓存和数据库数据的一致性?

105.什么是缓存穿透,什么是缓存雪崩?怎么解决?

106.如何对数据库进行优化?

107.使用索引时有哪些原则?

108.存储过程如何进行优化?

109.说说如何对Tomcat进行优化?

110.BIO、NIO和AIO的区别?

111.Netty的特点?

112.Netty的线程模型?

113.如何进行JVM性能调优?

115.GC调优策略有哪些?

116.介绍下单点登录?

117.RabbitMQ的使用场景有哪些?

118.RabbitMQ有哪些重要的角色?有哪些重要的组件?

119.RabbitMQ中vhost的作用是什么?

120.介绍下RabbitMQ的架构?

121.RabbitMQ中的交换机类型有哪些?

122.除了ReetrantLock,你还接触过JUC并发包中的哪些并发API?

123.你了解哪些负载均衡算法、策略?

124.如何设计符合幂等性的高质量Restful   API ?

125.如何理解Restful API 的幂等性?

126.jsp和servlet有什么区别?

127.forward和redirect的区别?

128.jsp有哪几个作用域?

129.session和cookie有什么区别?

130.如果客户端禁止cookie能实现session还能用吗?


104.怎么保证缓存和数据库数据的一致性?

1.淘汰缓存在;如果是较为复杂的数据时,进行缓存的更新操作就会变得异常复杂,因此一般推荐选择淘汰缓存,而不是更新缓存。

2.选择先淘汰缓存,再更新数据库,加入先更新数据库在淘汰缓存,如果淘汰缓存失败,那么后面的请求就会得到脏数据,直至缓存过期。加入先淘汰缓存再更新数据库,如果更新数据库失败,只会产生一次缓存穿透,相比较而言,后者对业务则没有本质上的影响。

3.延时双删除策略,如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。我们按照如下步骤执行:

  (1)请求A进行写操作,删除缓存

    (2)请求B查询发现缓存不存在

  (3)请求B去数据库查询得到旧值

  (4)请求B将旧值写入缓存

  (5)请求A将新值写入数据库,次数便出现了数据不一致问题,此时我们可以采用延时双删策略的已解决。

     

public  void  write(String key,Object data){
  redisUtils.del(key);
  db.update(data);
  Thread.Sleep(100);
  redisUtils.del(key);
}

这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可以根据业务场景进行一个调节。

4.数据库读写分离的场景

假如有如下场景:两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。我们按照如下步骤执行:

1.请求A进行写操作,删除缓存

2.请求A将数据写入数据库了

3.请求B查询缓存发现,缓存没有值

4.请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值。

5.请求B将旧值写入缓存

6.数据库完成主从同步,从库变为新值,依旧采用延时双删策略解决此问题。

105.什么是缓存穿透,什么是缓存雪崩?怎么解决?

1.缓存穿透:一般的缓存系统,都是按照key去缓存查询,如果不存在对用的value,就应该去后端系统去查找(比如DB数据库)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

2.怎么解决?

对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的bitmap中,查询时通过该bitmap过滤。

3.缓存雪崩:当缓存服务器重启或者大量缓存集中在某一时间段失效,这样在失效的时候,会给后端系统带来大量的压力,导致系统崩溃。

4.如何解决?在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待;做二级缓存;不同的key,设置不同的过期时间,让缓存失效的时间尽量均匀。

106.如何对数据库进行优化?

1.选取适合的字段属性

  为了获取更好的性能,可以将表中字段的宽度设的尽可能小。

  尽量把字段设置成not null

  执行查询的时候,数据库不用去比较null值

  对某些省份或者性别字段,将他们定义为enum类型

  enum类型被当做数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快很多。

2.使用join链接代替子查询

3.使用联合union来代替手动创建的临时表union用法中,两个select语句的字段类型要匹配,而且字段个数要相同。

5.锁定表:尽管事务时维护数据库完整性的一个非常好的方法,但却因为他的独占性,有时候会影响数据库的性能,尤其是在大应用中。由于在事务执行的过程中,数据库会被锁定,因此其他用户只能暂时等待直到数据库结束。有的时候可以用锁定表的方法获得更好的性能。

共享锁:

    其他用户只能看,不能修改lock table person in share mode;对于通过lock table命令主动添加的锁来说,如果要释放他们,只需发出rollback命令即可。

6.使用外键:锁定表的方法可以维护数据的完整性,但是他却不能保证数据的关联性,这个时候可以使用外键。

7.使用索引:索引时提高数据库查询速度的常用方法,尤其是查询语句中包含max(),min(),order by这些命令的时候,性能提高更为显著。一般来说索引应该建在常用于join,where,order by的字段上。尽量不要对数据库中含有大量重复的值得字段建立索引。

8.优化的查询语句:在索引的字段上尽量不要使用函数进行操作。尽量不要使用like关键字和通配符,这样做法很简单,但却是以牺牲性能为代价的。避免在查询中进行自动类型转换,因为类型转换也会使索引失效。

107.使用索引时有哪些原则?

 常见的索引原则有:

   1.选择唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

2.为经常需要排序,分组和联合操作的字段建立索引;

3.为常作为查询条件的字段建立索引。

4.限制索引的数据:越多的索引,会使更新表变得很浪费时间。

5.尽量使用数据量少的索引。

6.如果索引的值很长,那么查询的速度会受到影响。

7.尽量使用前缀来索引。

8.如果索引字段的值很长,最好使用值的前缀来索引。

9.删除不再使用或者很少使用的索引。

10.最左前缀匹配原则,非常重要的原则。

11.尽量选择区分度高的列作为索引。

12.索引列不能参与计算,保持列干净:但函数的查询不参与索引。

13.尽量的扩展索引,不要新建索引。

108.存储过程如何进行优化?

存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中,经过一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行他。存储过程是数据库中的一个重要对象。

存储过程优化思路:

1.尽量利用一些SQL语句来替代一些小循环,例如聚合函数,求平均函数等。

2.中间结果存放于临时表,加索引。

3.少使用游标。SQL是个集合语言,对于集合运算具有较高性能。而cursors是过程运算。比如一个100万行的数据进行查询。游标需要读取100万次,而不使用游标只需要少量几次读取。

4.事务越短越好。SqlServer支持并发操作。如果事务过多过长,或者隔离级别过高,都会造成并发操作的阻塞,死锁。导致查询极慢,CPU占用率极低。

5.使用try  catch处理错误异常

6.查找语句尽量不要放在循环内。

109.说说如何对Tomcat进行优化?

Tomcat作为Web服务器,他的处理性能直接关系到用户体验,下面是几种常见的优化措施。

1.去掉对web.xml的监视,把jsp提前编辑成Servlet。有抚育物理内存的情况,加大Tomcat使用的JVM的内存。

2.服务器资源

服务器所能提供CPU,内存,硬盘的性能对处理能力有决定性影响。

2.1对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。


2.3硬盘主要问题就是读写性能,当大量文件进行读写时,硬盘极容易称为性能瓶颈。最好的办法还是利用下面提到的缓存。

3.利用缓存和压缩

    对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为缓存服务器,将图片,css,js文件都进行了缓存,有效的减少了后端Tomcat的访问。

     另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。但考虑带Tomcat已经需要处理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。

     除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进项压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾静我就见过一个图片从300多kb压缩到几十kb,自己几乎看不出来区别。

4.采用集群

单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建Tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个Tomcat共享session来协同工作。

5.优化Tomcat参数

这里以Tomcat7的参数配置为例,需要修改conf/server.xml文件,主要是优化连接配置,关闭客户端dnd查询。

110.BIO、NIO和AIO的区别?

1.基本概念

   BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。

   伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。

   NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程处理。

   AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

2.常规区别

   BIO是面向流的,NIO是面向缓冲区的;

BIO的各种流是阻塞的。

而NIO是非阻塞的。

BIO的Stream是单向的,而NIO的channel是双向的。NIO特点:事件驱动模型,单线程处理多任务,非阻塞I/O,I/O读写不再阻塞,而是返回0,基于block的传输比基于流的传输更高效,更高级的IO函数zero  copy,IO多路复用大大提高了Java网络应用的可伸缩性和实用性。

基于Reactor线程模型。在Reactor模式中,事件分发器等待某个事件或者可应用或者某个操作的状态发生,时间分发器就把这个事件事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。

如在Reactor中实现读:注册读就绪事件和相应的事件处理器,事件分发器等待事件,事件到来,激活分发器,分发器调用事件对应的处理器,事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

111.Netty的特点?

  一个高性能,异步事件驱动的NIO框架,他提供了对TCP,UDP和文件传输的支持使用更高效的socket底层,对epoll空轮询引起的CPU占用飙升在内部进行了处理,避免了直接使用NIO的陷阱,简化了NIO的处理方式。

采用多种decoder/encoder支持,对TCP粘包/分包进行自动化处理,可使用接受/处理线程池,提高连接效率,对重连,心跳检测的简单支持。

可以配置IO线程数,TCP参数,TCP接收和发送缓冲区使用直接内存代替堆内存,通过内存池的方式循环利用ByteBuf通过引用计数器及时申请释放不再引用对象,降低了GC频率使用单线程串行化的方式,高效的Reactor线程模型大量使用了volitale,使用了CAS和原子类,线程安全类的使用,读写锁的使用。

112.Netty的线程模型?

    Netty通过Reacor模型基于多路复用器接收并处理用户请求,内部实现了了两个线程池,boss线程池和work线程池。其中boss线程池的线程负责处理请求的accept,当接收到accept事件的请求时,把对应的socket封装到一个NIOSocketChannel中,并交给work线程池,其中work线程池负责请求的read和write事件,由对应的Handler处理。

  单线程模型:所有I/O操作都有一个线程完成,即多路复用,事件分发和处理都是在一个Reactor线程上完成的。既要接受客户端的连接请求,向服务器端发起连接,又要发送/读取请求或者应答/响应消息。

一个NIO线程同时处理成百上千的链路,性能上无法支撑,速度慢,若线程进入死循环,整个程序不可用,对于高负载,大并发的应用场景不合适。

多线程模型:有一个NIO线程(Acceptor只负责监听服务器,接受客户端的TCP连接请求,NIO线程池负责网络IO的操作,即消息的读取,解码,编码和发送。

1个NIO线程可以同时处理N条链路,但是一个链路只对应1个NIO线程,这是为了防止发生并发操作问题。但在并发百万客户端连接或者需要安全认证时,一个Acceptor线程可能会存在性能不足问题。

主从多线程模型:Acceptor线程用于绑定监听端口,接收客户端连接,将SocketChannel从主线程池的Reactor线程的多路复用器上移除,用于处理I/O的读写等操作,从而保证mainReactor只负责接入认证,握手等操作。

113.如何进行JVM性能调优?

1.监控GC的状态,使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分GC执行时间,觉得是否进行优化。

举一个例子:系统崩溃前的一些现象:

  每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4,5s

  FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC

  年老代的内存越来越大并且每次FullGC后年老代没有内存被释放之后系统就会无法响应新的请求,逐渐到达OutOfMemoryError的临界值,这个时候就需要分析JVM内存快照dump。

2.生成堆的dump文件。

通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没有启动JMX可以通过Java的jmap命令来生成该文件。

3.分析dump文件打开这个3g的堆信息文件,显然一般的Window系统没有那么大内存,必须借助高配置的Linux,几种工具打开该文件:

  Visual VM   

   IBM  HeapAnalyzer

   JDK自带的Hprof工具

   Mat(Eclipse专门的静态内存分析工具)推荐使用

备注:文件太大,建议使用Eclipse专门的静态内存分析工具Mat打开分析。

4.分析结果,判断是需要优化,如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化,如果GC事件超过1到3秒,或者频繁GC,则必须优化。

注:如果满足下面的指标,则一般不需要进行GC:

  Minor  GC执行时间不到50毫秒;

  Minor  GC执行不频繁,约10秒一次;

  FullGC执行时间不到1秒;

  FullGC执行频率不算频繁,不低于10分钟一次;

5.调整GC类型和内存分配,如果内存分配过大或者过下,或者采用的GC收集器比较慢,则应该优先调整这些参数,并且先找一台或者几台机器进行beat,然后比较优化过的机器和没有优化的机器性能对比,并有针对性的做出最后选择。

6.不读拿的分析和调整,通过不断地试验和试错,分析并找到最合适的参数,如果找到了最合适的参数,则将这些参数应用到所有的服务器。

114.JVM调优参数有哪些?

115.GC调优策略有哪些?

116.介绍下单点登录?

117.RabbitMQ的使用场景有哪些?

1.解决一步问题,例如用户注册,发送邮件和短信反馈注册成功,可以使用RabbitMQ消息队列,用户无需等待反馈。

2.服务间解耦,订单系统和库存系统,中间加入RabbitMQ消息队列,当库存系统出现问题时,订单系统依旧能正常使用,降低服务间耦合度。

3.秒杀系统,利用RabbitMQ的最大值,实现秒杀系统。

118.RabbitMQ有哪些重要的角色?有哪些重要的组件?

1.RabbitMQ有哪些重要角色?客户端,RabbitMQ服务端。

2.有哪些重要组件?

 2.1connectionFactory(连接管理器)应用程序与RabbitMQ之间建立连接的管理器。

 2.2Channel(信道)消息推送使用的信道。

 2.3RoutingKey(路由键)用于把生产者的数据分配到交换机上。

 2.4Exchange(绑定键)用于把交换机的消息绑定到队列上

 2.6Queue(队列)用于存储生产者消息。

119.RabbitMQ中vhost的作用是什么?

   vhost可以理解为mini版的RabbitMQ,其内容均含有独立的交换机,绑定,队列,最重要的是拥有独立的权限系统,可以做到vhost范围内的用户控制。

用RabbitMQ全局考虑,不同的应用可以跑在不同的vhost上,作为不同权限隔离的手段。

120.介绍下RabbitMQ的架构?

121.RabbitMQ中的交换机类型有哪些?

122.除了ReetrantLock,你还接触过JUC并发包中的哪些并发API?

123.你了解哪些负载均衡算法、策略?

124.如何设计符合幂等性的高质量Restful   API ?

125.如何理解Restful API 的幂等性?

126.jsp和servlet有什么区别?

127.forward和redirect的区别?

128.jsp有哪几个作用域?

129.session和cookie有什么区别?

130.如果客户端禁止cookie能实现session还能用吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/276557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大厂前端面试题总结(百度、字节跳动、腾讯、小米.....),附上热乎面试经验!

先简单介绍下自己,我“平平无奇小天才”一枚,毕业于南方普通985普通学生,有幸去百度、字节面试,感觉大公司就是不一样,印象最深的是字节,所以有必要总结一下面试经验,以及面试中遇到的一些问题&…

QT应用篇 三、QML自定义显示SpinBox的加减按键图片及显示值效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.SpinBox组件2.SpinBox中QML的使用 总结 前言 记录自己学习QML的一些小技巧方便日后查找 QT的…

unity学习笔记----游戏练习02

一、阳光值的展示和消耗 1.创建一个文本组件用于显示阳光的数值,然后在脚本中得到这个UI。 在SunManger中得到这个组件的引用 public TextMeshProUGUI sunPointText; 写一个用于更新显示的方法 public void UpdataSunPointText() { sunPointText.tex…

多模态大模型-CogVLm 论文阅读笔记

多模态大模型-CogVLm 论文阅读笔记 COGVLM: VISUAL EXPERT FOR LARGE LANGUAGEMODELS 论文地址 :https://arxiv.org/pdf/2311.03079.pdfcode地址 : https://github.com/THUDM/CogVLM时间 : 2023-11机构 : zhipuai,tsinghua关键词: visual language model效果:(2023…

小型企业成为网络犯罪分子获取数据的目标

在过去十年的大部分时间里,网络犯罪的巨额资金来自针对大型组织的勒索软件攻击。这种威胁仍然存在。但犯罪分子可能会将注意力转向中小企业 (SMB)。这对消费者的影响将是巨大的。 将软件即服务 (SaaS) 技术用于核心业务功能继续将中小企业整合到全球供应链中。由于…

鸿蒙APP的代码规范

鸿蒙APP的代码规范是为了确保代码质量、可读性和可维护性而定义的一系列规则和标准。以下是一些建议的鸿蒙APP代码规范,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 代码风格: 采用…

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(4)-自制数据集及训练(使用makesense标注数据集)

如何制作和训练自己的数据集 看yolov5官网创建数据集1.搜索需要的图片2.创建标签标注数据集地址:放入图片后选择目标检测创建文档,每个标签写在单独的一行上传结果此处可以编辑类别把车框选选择类别即可导出数据 3.新建一个目录放数据写yaml文件 4. 测试…

安装Node修改Node镜像地址搭建Vue脚手架创建Vue项目

1、安装VSCode和Node 下载VSCode Visual Studio Code - Code Editing. Redefined 下载Node Node.js (nodejs.org) 检验是否安装成功,WinR,输入cmd命令,使用node -v可以查看到其版本号 2、修改镜像地址 安装好node之后,开始修改镜像地址 …

【Unity动画系统】Unity动画系统Animation详解,参数细节你是否弄清?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

蓝牙物联网智能安防系统设计方案

1概述 安防系统(安全防护)的作用是预防损失,是人们保障人身和财产安全最重要的工具之一。近年来,伴随经济的飞速发展和城市人口的急剧增加,盗窃、入室抢劫等事件的增多给人们的安定生活带来了很大的影响,同时,交通的快…

Grafana Loki 组件介绍

Loki 日志系统由以下3个部分组成: Loki是主服务器,负责存储日志和处理查询。Promtail是专为loki定制的代理,负责收集日志并将其发送给 loki 。Grafana用于 UI展示。 Distributor Distributor 是客户端连接的组件,用于收集日志…

无监督学习(上)

我们实际用到的项目大都是有监督的,而人工智能未来的一大难点将会是无监督学习。在前面说过的降维算法,大部分都是无监督,除了LDA。 无监督算法有聚类,密度估计,常常用在做分类或者异常检测上。 一.聚类 聚类就是识…

聚焦亚马逊云科技 re:Invent re:Cap专场,重构生成式AI的无限可能!

摘要:12月14日至17日,第十二届全球软件案例研究峰会(简称TOP100summit)在北京国际会议中心成功举办,亚马逊云科技资深开发者布道师郑予彬、亚马逊云科技解决方案研发中心应用科学家肖宇、可以科技产品负责人曹临杰、亚马逊云科技解决方案架构…

【算法刷题】Day25

文章目录 1. 粉刷房子题干:算法原理:1. 状态表示:2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码: 2. 判定字符是否唯一题干:算法原理:1. 哈希表2. 位图思想 代码: 3. 丢失的数字题干&…

初步认识API安全

一、认识API 1. 什么是API API(应用程序接口):是一种软件中介,它允许两个不相关的应用程序相互通信。它就像一座桥梁,从一个程序接收请求或消息,然后将其传递给另一个程序,翻译消息并根据 API 的程序设计执行协议。A…

OpenCV-Python(21):OpenCV中的轮廓性质

3.轮廓的性质 本文我们将主要学习基于轮廓来提取一些经常使用的对象特征。 3.1 长宽比 边界矩形的宽高比: x,y,w,h cv2.boundingRect(cnt) aspect_ratio float(w)/h 3.2 Extent 轮廓面积与边界矩形面积的比。 area cv2.contourArea(cnt) x,y,w,h cv2.bounding…

Android 13 - Media框架(28)- MediaCodec(三)

上一节我们了解到 ACodec 执行完 start 流程后,会把所有的 input buffer 都提交给 MediaCodec 层,MediaCodec 是如何处理传上来的 buffer 呢?这一节我们就来了解一下这部分内容。 1、ACodecBufferChannel::fillThisBuffer ACodec 通过调用 A…

垃圾收集器与内存分配策略

内存分配和回收原则 对象优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 什么是内存泄漏 不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出 自动垃圾回收与手动垃圾回收 自动垃圾回收:由虚拟机来自动回收对象…

音频修复和增强软件:iZotope RX 10 (Win/Mac)中文汉化版

iZotope RX 是一款专业的音频修复和增强软件,一直是电影和电视节目中使用的行业标准音频修复工具,iZotope能够帮助用户对音频进行制作、后期合成处理、混音以及对损坏的音频进行修复,再解锁更多功能之后还能够对电影、游戏、电视之中的音频进…

超详细YOLOv8目标检测全程概述:环境、训练、验证与预测详解

目录 yolov8导航 YOLOv8(附带各种任务详细说明链接) 搭建环境说明 不同版本模型性能对比 不同版本对比 模型参数解释 不同版本说明 训练 训练示意代码 训练用数据集与 .yaml 配置方法 .yaml配置 数据说明 数据集路径 训练参数说明 训练过程…
最新文章