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);

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

R下载包显示unable to access index for repository:.......无法打开URL

1、报错“Warning: unable to access index for repository https://mirrors.bfsu.edu.cn/CRAN/src/contrib: cannot open URL https://mirrors.bfsu.edu.cn/CRAN/src/contrib/PACKAGES” 解决方法: > options(reposhttp://cran.rstudio.com/) #把https换成htt…

在树莓派上安装 ROS Melodic

树莓派的支持的系统比较多,以 Raspbian Buster 为例,记录在树莓派上下载并构建 ROS Melodic 的步骤,其他的派类似。 一、安装 ROS Melodic 打开树莓派终端并执行以下步骤。 1. 安装 repository key $ sudo sh -c echo "deb http://pack…

github-page静态网页将字符串写入github库中文本文档

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

【MySQL进阶之路 | 高级篇】MVCC三剑客:隐藏字段,Undo Log,ReadView

1. 再谈隔离级别 我们知道事务有四个隔离级别,可能存在三种并发问题: 在MySQL中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,如果仅从定义的角度来看,它并不能解决幻读问题。如果我们想要解…

python利用lxml模块爬取百度贴吧标题列表—新手练习的项目

一、爬取需求 就是用python,获取某百度贴吧的标题 二、代码 import lxml.html import requests ydm requests.get(https://tieba.baidu.com/f?ieutf-8&kw%E5%BC%A0%E5%A7%93%E4%B9%8B%E5%AE%B6).content.decode() selector lxml.html.fromstring(ydm) inf…

【Golang 面试基础题】每日 5 题(十)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

跨境电商独立站:Shopify/Wordpress/店匠选哪个?

在面对不断增加的平台运营压力时,不少跨境电商的商家逐渐将注意力转向建立自己的独立站。据《中国跨境出口电商发展报告(2022)》所示,中国拥有的独立站数量在2022年已接近20万个,这表明独立站已成为卖家拓展海外市场的…

Vue3分段控制器(Segmented)

效果如下图:在线预览 APIs Segmented 参数说明类型默认值必传block是否将宽度调整为父元素宽度,同时所有选项占据相同的宽度booleanfalsefalsedisabled是否禁用booleanfalsefalseoptions选项数据string[] | number[] | SegmentedOption[][]falsesize控…

LoRA:低秩自适应

LoRA:低秩自适应 本章节是对轻松上手微调大语言模型——QLORA篇中提到的LoRA的原理解释。 背后动机 现今模型的参数量变得越来越大,对预训练模型进行全微调变得越来越不可行。为了解决这个问题有了LoRA(Low-Rank Adaption)的诞生。将可训练…

ATF-541M4全解析(一)

目录 一、描述二、规格三、各参数最大值四、25℃下的典型值 一、描述 安华高科技 (Avago Technologies) 的 ATF-541M4 是一款高线性度、低噪声、单电源供电的E-PHEMT,封装在一个微型无引脚封装中。 ATF-541M4 的小尺寸和低外形使其非常适合用于混合模块和其他空间…

C++多态的底层原理

目录 1.虚函数表 (1)虚函数表指针 (2)虚函数表 2.虚函数表的继承--重写(覆盖)的原理 3.观察虚表的方法 (1)内存观察 (2)打印虚表 虚表的地址 函数 传参…

SpringBoot添加密码安全配置以及Jwt配置

Maven仓库(依赖查找) 1、SpringBoot安全访问配置 首先添加依赖 spring-boot-starter-security 然后之后每次启动项目之后,访问任何的请求都会要求输入密码才能请求。(如下) 在没有配置的情况下,默认用户…

【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

ctfshow-web入门-php特性(web137-web141)

目录 1、web137 2、web138 3、web139 4、web140 5、web141 1、web137 直接调用 ctfshow 这个类下的 getFlag 函数,payload: ctfshowctfshow::getFlag 查看源码: 拿到 flag:ctfshow{dd387d95-6fbe-4703-8ec5-9c8f9baf2bb5} 在…

【Linux】远程连接Linux虚拟机(MobaXterm)

【Linux】远程连接Linux虚拟机(MobaXterm) 零、原因 有时候我们在虚拟机中操作Linux不太方便,比如不能复制粘贴,不能传文件等等,我们在主机上使用远程连接软件远程连接Linux虚拟机后可以解决上面的问题。 壹、软件下…

MySQL_JDBC

目录 一、JDBC常用的接口和类 1.1 数据库连接 Connection 1.2 Statement 对象 二、JDBC的使用 总结 【Java 的数据库编程】 JDBC 即 Java Database Connectivity (Java数据库连接),是一种用于执行 SQL 语句的 Java API。这个 API 由 java.sql.*,javax.sql.* …

软件测试:Postman 工具的使用。开发及测试均需要掌握的测试工具

工具介绍 各个模块功能的介绍如下: 1、New:在这里创建新的请求、集合或环境;还可以创建更高级的文档、Mock Server 和 Monitor以及API。 2、Import:这用于导入集合或环境。有一些选项,例如从文件,文件夹导…

Linux环境下(DeepinV20+)使用docker安装和使用mysql、redis、minio等各类中间件(后续用到其他中间件会继续更新)

docker安装:https://blog.csdn.net/HXBest/article/details/140702265 本人环境放置路径为:/env/中间件名称/,实际改为你自己的!!! 一、mysql安装和使用 docker run -itd --name mysql -p 3306:3306 \ -d …

用 apifox cli 命令行运行本地接口出现TypeError:Invalid IP address: undefined

用 apifox cli 命令行运行本地接口出现TypeError:Invalid IP address: undefined,客户端运行是通过的但命令行运行会报错 修改端口也是一样报错,地址修改为127.0.0.1会报错connect ECONNREFUSED 127.0.0.1:8080 解决方法:不用localhost&…

PHP家政系统自营+多商户独立端口系统源码小程序

家政行业的新篇章 引言:家政行业的数字化转型 近年来,随着科技的飞速发展和人们生活节奏的加快,家政服务行业也迎来了数字化转型的浪潮。为了提升服务效率、优化用户体验,越来越多的家政公司开始探索“家政系统自营多商户小程序…