当前位置: 首页 > news >正文

Java高频面试题分享

文章目录

      • 1. 策略模式怎么控制策略的选取
        • 1.1 追问:如果有100种策略呢?
        • 1.2 追问:什么情况下初始化Map
      • 2. 什么是索引?什么时候用索引?
        • 2.1 追问:怎么判断系统什么时候用量比较少
        • 2.2 追问:如何实时的查看日志
      • 3. 怎么实现发送短信功能
        • 3.1 追问:怎么防止短信被刷
        • 3.2 追问:怎么实现限制短信发送频率
      • 4. 什么是AOP?怎么在项目中运用AOP
        • 4.1 追问:Spring AOP是怎么实现的
        • 4.2 追问:Spring AOP是基于哪一种动态代理
      • 5. MySQL读写分离怎么实现
        • 5.1 追问:主从节点是如何同步的
        • 5.2 追问:有几种同步模式,分别介绍一下
      • 6. 介绍一下缓存雪崩
      • 7. redis缓存和数据库不一致的问题
        • 7.1 追问:为什么不适用延迟双删
      • 8. RabbitMQ重复消费问题
        • 8.1 追问:如何保证消息不丢失
        • 8.2 追问:多个消费者消费同一个消息如何实现
        • 8.3 追问:RabbitMQ有哪几种工作模型
        • 8.4 追问:多个消费者,如何保证只有一个消费者去消费一个消息(生产者消息来了是直接给所有的消费者的)

1. 策略模式怎么控制策略的选取

答:
if else

1.1 追问:如果有100种策略呢?

答:
使用Map来做字段和策略的映射

1.2 追问:什么情况下初始化Map

答:

  1. 在项目运行的时候去初始化Map,相当于提前加载
  2. 如果策略很多,在用户使用的时候再去加载,相当于懒加载,之后需要再次使用的时候去读取初始化的策略就可以了

2. 什么是索引?什么时候用索引?

答:
索引在MySQL中也叫做“键”,它是一个特殊的文件,它保存着数据表里所有记录的位置信息,更通俗的来说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率

2.1 追问:怎么判断系统什么时候用量比较少

答:
看日志、看负载、看CPU、看接口调用量

2.2 追问:如何实时的查看日志

答:
tail -f

3. 怎么实现发送短信功能

答:
第三方运营商服务,引入对应的包,填写对应的参数(一般都有ak,sk),更具示例代码编写自己的逻辑就可以

3.1 追问:怎么防止短信被刷

答:
验证码+限制短信发送频率

3.2 追问:怎么实现限制短信发送频率

答:redis

4. 什么是AOP?怎么在项目中运用AOP

4.1 追问:Spring AOP是怎么实现的
4.2 追问:Spring AOP是基于哪一种动态代理

详情见文章:Spring AOP(概念、实战、原理)

5. MySQL读写分离怎么实现

答:
定义主服务器和从服务器,主服务器负责写数据,从服务器只负责读数据

5.1 追问:主从节点是如何同步的

答:
在这里插入图片描述

5.2 追问:有几种同步模式,分别介绍一下

有两种同步模式
异步同步模式
异步同步模式是MySQL默认的同步策略模式,客户端向服务端发送请求后,master处理完之后,直接返回客户端结果,接着在将对应的log信息发送给slave节点
半同步模式

  1. master处理完自身操作,将对应的binary log 发送从服务器,从服务器通过io thread线程写入到relay log中,然后将结果返回给master,master在收到salve的响应之后返回给客户端
  2. 半同步模式是基于异步复制的基础上进行的,无非是半同步模式需要安装异步插件完成

6. 介绍一下缓存雪崩

原因:同一时间段key大量过期
解决:
4. 设置不同过期时间(一个固定值,一个随机值)
5. 多级缓存
6. 降级处理(最简单的抛出异常,也可以返回一些简化的内容或者静态页面)

7. redis缓存和数据库不一致的问题

采用redisson实现的读写锁,在读的时候添加共享锁,可以保证读读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读读,读写都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一锁才行。
注意:这种情况只有必须保证强一致性的时候才会使用

开发中大部分是允许短暂的不一致的,这个时候采用异步的方案
● 使用MQ中间件,更新数据之后,通知缓存删除
● 利用canal中间件,不需要修改业务代码,伪装为MySQL的一个从节点,canal通过读取binlog数据更新缓存

7.1 追问:为什么不适用延迟双删

延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据,其中这个延时多久不太好确定,在演示的过程中可能会出现脏数据,并不能保证强一致性,所以没有采用

8. RabbitMQ重复消费问题

  1. 给每一个消息携带一个全局唯一id
    ● 消费者监听到消息后获取id,先去查询这个id是否存在
    ● 如果不存在,则正常消费消息,并将消息的id存入数据库或者redis中
    ● 如果存在则丢弃此消息
  2. 分布式锁
    ● 以唯一的消息id为键加锁,消费过后就上锁,下次消息再过来就判断
8.1 追问:如何保证消息不丢失

第一个是开启生产者确认机制,确保生产者的消息能到达队列,如果报错可 以先记录到日志中,再去修复数据
详细的:
RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功
如果到达消费者,则会返回publish-confirm ack,如果到交换机失败,则返回publish-confirm nack,如果到队列失败了,则返回publish-return ack

第二个是开启持久化功能,确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化
详细的:

第三个是开启消费者确认机制
1. auto
自动ACK。Spring AMQP提供了一种自动的消息确认机制。它利用AOP(面向切面编程)对消息处理逻辑做了环绕增强。当业务正常执行时,Spring AMQP会自动返回ACK。当业务出现异常时,根据异常判断返回不同结果:业务异常,自动返回NACK;消息处理或校验异常,自动返回REJECT。

2. manual
手动ACK。消费者接收到消息后需要手动发送确认给发送者,发送者才会继续发送下一条消息。在这种模式下,如果消费者处理消息失败,可以手动发送NACK给发送者,告诉发送者这条消息处理失败,以便发送者重新发送消息。这种模式可以保证消息的可靠性,但需要消费者手动处理确认和NACK。
Channel.basicAck()方法

channel.basicAck(deliveryTag,true);

肯定确认,消费成功,可以删除
Channel.basicreject()方法

channel.basicReject(deliveryTag, true);

拒绝deliveryTag对应的消息,第二个参数是否requeue,true则重新入队列,否则丢弃或者进入死信队列。
该方法reject后,该消费者还是会消费到该条被reject的消息。
Channel.basicnack()方法

channel.basicNack(deliveryTag, false, true);

为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue
与basic.reject区别就是同时支持多个消息,可以nack该消费者先前接收未ack的所有消息。nack后的消息也会被自己消费到。
Channel.basicrecover()方法

channel.basicRecover(true);

是否恢复消息到队列,参数是是否requeue,true则重新入队列,并且尽可能的将之前recover的消息投递给其他消费者消费,而不是自己再次消费。false则消息会重新被投递给自己。

8.2 追问:多个消费者消费同一个消息如何实现

发布订阅模式

8.3 追问:RabbitMQ有哪几种工作模型

一、简单模式
简单模式是最基本的消息队列模式,适用于一个生产者和一个消费者的场景。生产者发送消息到队列,消费者从队列中获取消息进行处理。这种模式的优点是简单易用,但缺点是消息只能被一个消费者消费,且没有消息的确认机制,可能会出现消息丢失的情况。
二、工作队列模式
工作队列模式适用于多个消费者共同处理一个任务的情况。生产者将任务发布到队列中,多个消费者监听同一个队列,通过竞争获取任务进行处理。这种模式的优点是能够充分利用多个处理器的计算能力,提高系统的吞吐量。但缺点是可能会导致多个消费者同时处理同一个任务,造成资源的浪费。
三、发布订阅模式
发布订阅模式是一种广播模式,适用于一对多消息传递的场景。生产者将消息发布到交换机,交换机将消息转发给所有绑定到该交换机的队列,消费者从队列中获取消息进行处理。这种模式的优点是能够实现一对多的消息传递,提高系统的扩展性。但缺点是可能会导致消息的重复传递和消费者的重复消费。
四、路由模式
路由模式是一种更灵活的消息传递方式,适用于多个业务系统的集成。生产者将消息发送到交换机,交换机根据routing key将消息路由到一个或多个队列中,消费者从队列中获取消息进行处理。这种模式的优点是能够根据业务需求灵活地路由消息,提高系统的可扩展性和灵活性。但缺点是需要合理地设计routing key以避免消息的丢失或重复传递。
五、通配符模式
通配符模式是一种匹配规则的消息传递方式,适用于多级菜单的场景。生产者将消息发送到交换机,交换机根据通配符匹配规则将消息路由到对应的队列中,消费者从队列中获取消息进行处理。这种模式的优点是能够根据规则匹配到多个队列,实现多级菜单的消息传递。但缺点是需要合理地设计通配符规则以避免消息的错漏或重复传递。
六、主题模式
主题模式是一种基于关键字订阅的消息传递方式,适用于多级分类的场景。生产者将消息发布到主题交换机,交换机将消息转发给所有绑定到该主题交换机的队列,消费者从队列中获取消息进行处理。这种模式的优点是能够根据关键字订阅消息,实现多级分类的消息传递。但缺点是需要合理地设计主题和关键字以避免消息的错漏或重复传递。

8.4 追问:多个消费者,如何保证只有一个消费者去消费一个消息(生产者消息来了是直接给所有的消费者的)

默认情况下,RabbitMq收到消息后,就向消费者全部推送。但是如果rabbitmq队列里消息过多,且消息的数量超过了消费者处理能力, 就会导致客户端超负荷崩溃。此时我们可以通过 prefetchCount 限制每个消费者在收到下一个确认回执前一次可以最大接受多少条消息。即如果设置prefetchCount =1,RabbitMQ向这个消费者发送一个消息后,再这个消息的消费者对这个消息进行ack之前,RabbitMQ不会向这个消费者发送新的消息

 // 每个客户端每次最后获取N个消息
channel.basicQos(1);

相关文章:

Java高频面试题分享

文章目录 1. 策略模式怎么控制策略的选取1.1 追问:如果有100种策略呢?1.2 追问:什么情况下初始化Map 2. 什么是索引?什么时候用索引?2.1 追问:怎么判断系统什么时候用量比较少2.2 追问:如何实时…...

kvm虚拟化平台部署

kvm虚拟化平台部署 kvm概念简介 kvm自linux2.6版本以后就整合到内核中,因此可以看做是一个原生架构. kvm虚拟化架构 硬件底层提供物理层面的硬件支持 linux(host),就相当于这个架构中的宿主机,上面运行了多个虚拟机。…...

利用arthas热更新class文件

利用arthas热更新class文件 背景:发现一个bug,家里难以复现,需要在现场环境更新几行代码验证。 arthas-boot version: 3.7.1 java -jar arthas-boot.jar启动arthas 1、利用arthas的sc命令查找确定类名称 sc com.**2、反编译为java文件 …...

天机学堂 第四天 高并发优化总结

前端每隔15秒就发起一次请求,将播放记录写入数据库。 但问题是,提交播放记录的业务太复杂了,其中涉及到大量的数据库操作: 如何进行优化 单机并发能力 变同步为异步 合并写请求 提高单机并发:优化SQL,尽…...

Canva收购Leonardo.ai,增强生成式AI技术能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

前端练习<HtmlCSS>——照片墙(附完整代码及实现效果)

这个小练习也来源于b站up小K师兄,大家可以通过下面的链接学习哦~up讲的非常详细。 纯CSS写一个简单酷炫的照片墙效果~ 先看一下这个照片墙的效果: 1.鼠标没有放到图片上时,照片同比例,每张照片都有倒影的效果。 2.然…...

PHP基于微信小程序的打车平台-计算机毕业设计源码78689

摘 要 本文介绍的是基于PHP开发的打车平台小程序。该系统旨在为用户提供一个便捷、高效的平台,以实现网约车的打车功能。随着社交媒体和互联网的普及,网约车已成为日常交通中常见的形式。然而,传统的打车方式存在不方便、不及时等问题。 微信…...

Vue element ui分页组件示例

https://andi.cn/page/621615.html...

redis存储结构

一、整体结构图 二、redisDb结构体 Redis是一个高性能的键值存储系统,它支持多种类型的数据结构,如字符串、列表、集合、散列等。Redis数据库由多个数据库组成,每个数据库用一个redisDb结构体来表示。 dict *dict; dict指向一个字典结构的指…...

SQL Server 数据误删的恢复

在日常的数据库管理中,数据的误删操作是难以避免的。为了确保数据的安全性和完整性,我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 SQL Server 中进行数据的备份和恢复操作,特别是在发生数据误删的情况下。假设我们已经…...

墨烯的C语言技术栈-C语言基础-018

char c; //1byte字节 8bit比特位 int main() { int a 10; //向内存申请四个字节,存储10 &a; //取地址操作符 return 0; } 每个字节都有地址 而a的地址就是它第一个字节的地址 要先开始调试才可以查看监控和查看内存 左边是地址 中间是内存中的数据 最后面的是…...

C端与B端 - 第一弹 - 理解和区分C端与B端软件开发

作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 在软件开发领域…...

穿越多元宇宙的.NET:一场跨平台的星际旅行

概述 在软件开发的浩瀚宇宙中,.NET无疑是一颗耀眼的恒星,散发着多平台开发的光芒。从单一的.NET Framework出发,我们如今已拥有一个多元化的.NET宇宙,每个变体都是一个独特的星球,拥有自己的生态系统和生存法则。本文将…...

Python自学第五天

# 嵌套 字典嵌套字典 # 字典列表 now {pet:cat,color:black} now1 {pet:cat,color:pipe} wq [now,now1] # 这里是中括号 不是花括号 花括号打印不出来 for ff in wq:print(ff) # 创建20个外星人 打印前三个 并且显示一共创建了多少个外星人 now [] for wq in range(20):# 这…...

Cookie-Monster:一款针对Web浏览器的安全分析与数据提取工具

关于Cookie-Monster Cookie-Monster是一款针对常见Web浏览器的安全分析与数据提取工具,该工具可以帮助广大研究人员提取并分析Edge、Chrome和Firefox浏览器中的Cookie数据。 Cookie-Monster适用于红队和蓝队成员,能够提取WebKit主密钥,找到具…...

C语言的结构体

结构体定义 结构体指针...

C语言 写一个函数days,实现某日在本年中是第几天计算。

写一个函数days, 【定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题&#xff08;即将闰年情况包含在内&#xff09;】 由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。 ​#include <stdio.h>typedef struct {int yea…...

2-50 基于matlab的遗传模拟退火算法的聚类算法

基于matlab的遗传模拟退火算法的聚类算法&#xff0c;以模糊K-均值聚类算法为基础&#xff0c;对各样本的聚类中心进行优化&#xff0c;输出聚类可视化结果。聚类类别数可自由输入。程序已调通&#xff0c;可直接运行。 2-50 遗传模拟退火算法的聚类算法 - 小红书 (xiaohongshu…...

电脑屏幕录制软件,分享4款(2024最新)

在今天&#xff0c;我们的电脑屏幕成为了一个多彩多姿的窗口。通过它我们可以浏览网页、观看视频、处理文档、进行游戏……有时&#xff0c;我们想要记录下这些精彩瞬间&#xff0c;与朋友分享&#xff0c;或者作为教程留存&#xff0c;这时&#xff0c;电脑屏幕录制就显得尤为…...

机械学习—零基础学习日志(高数16——函数极限性质)

零基础为了学人工智能&#xff0c;真的开始复习高数 这里我们继续学习函数极限的性质。 局部有界性 充分条件与必要条件 极限存在是函数局部有界的充分条件。什么是充分条件&#xff0c;什么是必要条件呢&#xff1f;我这里做了一点小思考&#xff0c;和大家分享&#xff0c…...

如何突破Windows远程桌面限制?RDP Wrapper Library让家庭版也能支持多人连接

如何突破Windows远程桌面限制&#xff1f;RDP Wrapper Library让家庭版也能支持多人连接 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 你是否曾因Windows家庭版无法支持多人远程桌面连接而感到困扰&#xff1f;R…...

终极Python金融数据接口:3步掌握免费高效的A股数据获取方案

终极Python金融数据接口&#xff1a;3步掌握免费高效的A股数据获取方案 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析和量化交易领域&#xff0c;获取准确、及时且成本可控的市场…...

从0到1搭建AI-PPT流水线,支持中英双语自动适配+品牌VI强制注入(含可运行Python脚本+Power Automate配置包)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从0到1搭建AI-PPT流水线&#xff0c;支持中英双语自动适配品牌VI强制注入&#xff08;含可运行Python脚本Power Automate配置包&#xff09; 本方案构建端到端自动化PPT生成流水线&#xff0c;输入结构…...

金融数据宝藏库:沪深Level2与高频数据拆解

被高频数据搞懵了&#xff1f;硬盘空间就是这么没的。刚入坑那会儿&#xff0c;总想用最细的数据&#xff0c;结果光下载和整理就耗掉大半天&#xff0c;策略还没写呢。 今天简单聊聊几种常见的高频数据到底有啥区别&#xff0c;主要是沪深股票这块。数据来源是CMES金融数据库&…...

自动驾驶感知中的CFAR:毫米波雷达如何在海量杂波中揪出真实目标?

自动驾驶感知中的CFAR&#xff1a;毫米波雷达如何在海量杂波中揪出真实目标&#xff1f; 当一辆自动驾驶汽车行驶在繁华的城市街道时&#xff0c;它的毫米波雷达每秒会接收到成千上万个反射信号。这些信号中&#xff0c;只有极少数来自真正需要关注的行人、车辆等目标&#xff…...

深圳不锈钢五金冲压件

在深圳&#xff0c;不锈钢五金冲压件的市场需求巨大&#xff0c;广泛应用于智能家居、无人机、医疗器械、安防设备等众多领域。然而&#xff0c;面对众多的供应商&#xff0c;如何挑选到合适的合作伙伴成为了许多企业的难题。今天&#xff0c;我们就来对比测评几家深圳的不锈钢…...

告别定长接收!手把手教你修改S32K344 RTD 2.0.0的LPUART驱动,实现串口空闲中断接收不定长数据

突破S32K344串口接收限制&#xff1a;实战LPUART空闲中断改造指南 在车载ECU开发中&#xff0c;我们经常遇到传感器发送不定长数据帧的场景——比如OBD诊断仪的响应报文、胎压传感器的动态数据包。传统定长接收方案不仅浪费内存&#xff0c;更会导致数据截断或拼接错误。最近在…...

四类高危漏洞的工程化修复:XSS、越权、反序列化与硬编码密钥治理

1. 这不是“打补丁”&#xff0c;而是重构安全认知的起点很多人把代码审计后的漏洞修复&#xff0c;当成开发流程末尾一个不得不做的收尾动作——改几行代码、加个过滤、套个函数&#xff0c;提交、测试、上线&#xff0c;完事。我干了十多年安全审核和开发支持&#xff0c;亲手…...

终极Pandoc文档转换指南:5分钟掌握40+格式互转神器

终极Pandoc文档转换指南&#xff1a;5分钟掌握40格式互转神器 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 还在为不同文档格式之间的转换而烦恼吗&#xff1f;学术论文需要LaTeX排版&#xff0c;技术文档要…...

本地部署 Open Claw 保姆教程,同事还在手动整理文件,我已经让 AI 全搞定了

前言 2026 年开源圈热门的「数字员工」OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub 星标超 28 万&#xff0c;凭「本地运行 零代码操作 自动干活」的优势圈粉无数&#xff01;很多人误以为它是普通聊天 AI&#xff0c;实则是能真正操控电脑的自动化神器 …...