当前位置: 首页 > 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…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...