面试题总结:JAVA面试题(2024.02.29)

面试题汇总

http://t.csdnimg.cn/jtuir

– Bryan

Redis

Redis 使用场景

缓存:穿透,击穿,雪崩,双写一致,持久化,数据过期,淘汰策略

分布式锁:setnx/redisson

缓存穿透

不存在的数据,反复去数据库中查询

解决方案

  • 存空值
  • 布隆过滤器:通过算法计算hash,不一定能判断出存在,但是一定可以判断不存在

缓存击穿

设置过期时间,刚失效有大量数据同时请求

解决方案:

  • 互斥锁 强一致性
  • 逻辑过期,新开线程更新数据 高可用性

缓存雪崩

同一时段内,大量key同时失效

解决方案:

  • 给不同key的ttl加上随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务限流降级
  • 给业务加上多级缓存

双写一致

保证redis和mysql的数据一致性

读操作:缓存命中,直接返回;缓存未命中,查询数据,写入缓存,设定超时时间

写操作:延迟双删 删除缓存-修改数据- 延时 sleep(100) -删除缓存

双写一致:异步通知保证数据一致

回答:redisson的读写锁方案

持久性

RDB 和AOF

  • RDB redis database file redis数据快照文件

    将内存中所有文件保存到磁盘中

自动配置 reids.conf

  • AOF append only file 追加文件

默认关闭

记录命令

数据过期策略

  • 惰性删除 不会删除,访问时如果过期就删除 对cpu友好对内存不友好
  • 定期删除

数据淘汰策略

默认 - 不淘汰任何key 但不允许在新写入

  • LRU (least recently used) 最近最少使用 当前时间减去最后一次访问时间 越大跃先淘汰
  • LFU(least frequently used) 最少频率使用

分布式锁使用场景

集群情况下的定时任务,抢单,幂等

setnx set if not exists

命令:set lock value NX EX 10 NX 互斥 EX 过期时间

释放:DEL key

  • watch dog 续期 releaseTime/3
  • 可重入锁(同一线程中)
  • 主从一致性

主从复制,主从同步

主从复制 给一个版本号,bgsave生成RDB文件,更新成功 版本号更新

offset 偏移量 版本号 replid数据集标记 master上的唯一值

增量同步 根据offset 同步offset之后的数据

哨兵模式

监控,自动故障恢复,通知

脑裂问题 : 重选master后 旧master恢复了 强制降级为slave 导致数据丢失

解决方案:设置从节点数量,增大同步延时时间

分片

面试题

  • redis 单线程快的原因

存内存操作;单线程避免上下文,锁和安全等;使用I/O多路复用模型,非阻塞I/O

  • 解释一下I/O多路复用模型

单个线程,同时监听多个socket

mysql

如何定位慢查询

运维工具Skywalking 报告展示哪个sql慢

sql语句慢 怎么分析

聚合查询 - 新增临时表

​ 多表查询 - 优化sql语句

​ 表数据量过大查询 - 添加索引

执行计划 sql 前加Expain/DESC 分析

  • key:用到的索引
  • key_len 索引所占空间 Extra- 额外优化建议
  • type-null/system/const/eq_ref/ref/range/index(索引树扫描)/all

​ 深度分页查询

聚簇索引

聚簇索引:数据与索引放到一块,B+树叶子节点保存了整行数据,有且只有一个

非聚簇索引:数据与索引分开存储,B+树的叶子节点保存主键,可以有多个

回表 通过二级索引找多对应主键值,到聚集索引中查找整行数据的动作

**覆盖索引 **查询使用了索引,并且返回的值能在改索引中全部找到

Mysql超大分页怎么处理 覆盖索引+子查询

索引创建原则

主键索引/唯一索引/联合索引

  • 针对数据量比较大,查询频繁的 10w+
  • 针对常查寻的字段 where ,order by ,group by
  • 选择区分度高的字段
  • 字符串类型 尽量使用前缀索引
  • 尽量使用联合索引,减少回表
  • 控制索引数量,索引越多,成本越高
  • 如果索引列不包含null ,在创建时约束字段 not null

索引失效

  • 违反最左前缀法则
  • 范围查询 右边的列,不能使用索引
  • 索引上运算操作
  • 字符串不加单引号
  • 以%在前的模糊查询

SQL优化经验

  • 表设计优化

根据《阿里开发手册》嵩山版;sql优化 避免 select *

  • 索引优化
  • sql语句优化
  • 主从复制,读写分离
  • 分库分表

事务的特性

事务相关

  • A(原子性)C(一致性)I(隔离性)D(持久性)

事务隔离级别

并发事务问题:脏读,不可重复读,幻读

隔离级别:读未提交,读已提交,可重复读(默认),串行化

undo log和redo log区别

缓冲池 主内存的一个区域 在执行增删改查先操作缓冲池 按一定频率同步磁盘 减少IO次数

数据页 inndb数据页的最小单元 16k

redo log 重做日志,记录事务提交时的物理修改 保证事务持久性

undo log 回滚日志,记录修改前的信息。主要作用 提供回滚和MVCC(多版本并发控制) 保证一致性和原子性

保证隔离性:锁 / MVCC

mvcc 多版本并发控制 保证读写没有冲突

mysql主从同步原理

二进制日志,主库将DDL和DML写到 binlog中 - 从库读取-写入从库Relay log-从库重做中继日志中的事件

分表分库

垂直分库 微服务 高并发下 减少IO 提高效率

框架篇

Spring

Spring框架中单例bean时线程安全的吗?

不是

什么时AOP,在项目中有没有用过AOP?

面向切面编程,找到切点,在切点操作,减少重复代码降低耦合度

  • 记录操作日志

  • 缓存处理

  • spring 事务处理

    在方法之前拦截 开启事务 结束后提交事务 如果报错 回滚事务

    适用于大批量插入操作

Spring中事务失效的场景有哪些?

  • 异常捕获处理
image-20240221175926505
  • 抛出检查异常
image-20240221180132733
  • 非public方法
image-20240221180341030

spring bean的生命周期

BeanDefinition 对象-构造函数-依赖注入-Aware接口-BeanPostProcessor#Before-初始化方法-BeanPostProcessor#after-销毁

Spring的循环引用问题

三级缓存解决循环依赖问题

  • 一级缓存 单例池 singleton 对象

  • 二级缓存 缓存早期的bean对象 半成品对象 一二级解决一般对象的循环依赖

  • 三级缓存 缓存ObjectFactory,表示对象工厂,用来创建某个对象的 singletonFactories对象 一二三级解决代理对象循环依赖问题

question 2

A依赖B,B依赖A,用的是构造方法注入

A:bean周期中构造方法时第一个执行,spring框架不能解决依赖注入

使用@Lazy进行懒加载 什么时候需要对象再进行创建

image-20240221183329808

SpringMVC的执行流程

image-20240221183726642 image-20240221183917531

Springboot的自动配置原理

@SpringbootAplication

  • SpringbootConfiguartion
  • EnableAutoConfiguration
  • ComponentScan

其中@EnableAutoConfiguartion是实现自动化配置的核心注解。该注解通过@Import注解导入对应的配置选择器

Spring框架中常见的注解

image-20240221185215070 image-20240221185231416 image-20240221185401934

微服务

Eureka 注册中心

Eureka和Nacos的区别
模块 Nacos Eureka 说明
注册中心 服务治理基本功能,负责服务中心化注册
配置中心 Eureka需要配合Config实现配置中心,且不提供管理界面
动态刷新 Eureka需要配合MQ实现配置动态刷新,Nacos采用Netty保持TCP长连接实时推送
可用区AZ 对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换
分组 Nacos可用根据业务和环境进行分组管理
元数据 提供服务标签数据,例如环境或服务标识
权重 Nacos默认提供权重设置功能,调整承载流量压力
健康检查 Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳
负载均衡 均提供负责均衡策略,Eureka采用Ribion
管理界面 Nacos支持对服务在线管理,Eureka只是预览服务状态
基本参数

server.port=7001
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:7002/eureka/
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
#禁用 Eureka 的 ReadOnlyMap 缓存 (Eureka 端)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值