Java面试宝典 一问一答(第一期)(java面试问题大全及答案大全 word)
mhr18 2024-11-16 23:25 16 浏览 0 评论
1 redis分片集群,突然大量热点数据的请求落在同一个节点上,要扛不住了,有什么解决办法?
相关节点加从节点、可人工配置的热key的本地缓存层、热点Key施加随机Hash分散到其它节点
2 redis部署方案有哪些?
主从、主从+哨兵(故障监听自动切换)、客户端代理分配、中间件代理分片(Codis、Temproxy)、Cluster(去中心化)
主从不说了,哨兵所有节点存储所有数据,各种代理需要额外引入维护,Cluster故障转移、分片存储、数据找寻都是天然的最优解
数据少用哨兵,数据多用Cluster
3 Cluster为何要配置所有IP:Port?
提升性能和高可用,配置所有可以直连无需跳转,且防止启动时某个节点恰巧挂掉
4 Mysql主键索引,假如2000万数据,你能计算一下查询要几次IO吗?说说过程
主键索引结构B+树,Root加载于内存无需IO,另外叶子存储的是具体数据
磁盘一次IO是一页(16KB),指针为6字节、主键号int为4字节,非叶子不存值都是指针
每次IO一页 16000/10 = 1600 个指针,两次为256万 此处再看数据平均空间 若一页能存8条数据
则两次IO可获取2000万数据,若少于则3次
5 spring启动流程
6 Lock比Sync快在哪里,之后怎么又差不多,两者取舍
JDK1.5之前Sync无脑进入内核态阻塞,而Lock是有一定CAS最后不行再阻塞,当然最终都是重量级锁,依靠OS的mutex
1.6后Sync引入了偏向锁、轻量锁大大降低阻塞概率,而且官方建议在Sync满足情况下,推荐用Sync后续还有优化空间
Lock可以中断、可构造多个Condition条件、可公平
7 线程池随机几问
项目中用到不少线程池,为了方便定位问题,我们需要给不同线程池命名,请问如何做到?
线程池中有核心线程和非核心线程,当任务完成后,非核心线程是什么时候,怎样被回收的?
当线程池中某个线程出现异常时,线程池会如何处理该线程?我们又如何获取其异常信息?
线程池如何一开始就new出核心线程?
对于线程命名和异常处理,用自定义工厂解决
new ThreadFactoryBuilder()
.setNameFormat(prefix+"%d")
.setUncaughtExceptionHandler((thread, throwable)- > log.error("ThreadPool {} got exception", thread, throwable))
.get()
默认异常走System.err.print("Exception in thread \""+ t.getName() + "\" ");
e.printStackTrace(System.err); 然后线程销毁退出,当然不会影响其它线程和线程池的继续运行
UncaughtExceptionHandler只适用execute,如果是submit则异常信息存在于FutureTask里,我们自己获取时会抛出异常
用preStartAllCoreThreads 线程池预热
8 Redis偶尔查询会比较耗时,排查思路?
可能因素非常多:复杂命令、大Key、fork、集中过期、内存满触发淘汰、AOF每次均刷盘、绑定CPU、网卡负载过高、内存数据被换到Swap
排查思路:
1 慢查询日志 -> 查看慢查询里是否有复杂命令
2 bigkeys命令 -> 查看是否有大Key
3 查看是否使用expireat或pexpireat(绝对时间过期) --> 绝对时间+Random
4 Fork - AOF、RDB --> 若开启则最好在从节点搞,刷盘用1s间隔策略、
info命令查看最后一次fork执行的耗时latest_fork_usec
5 查看内存、SWAP、网卡、CPU使用情况
9 Redis过期策略
主动+被动
主动:定时任务占用主线程每100毫秒从过期字典中随机取20个key,删除过期的key,如果过期key的比例超过了25%,则继续获取20个key,删除过期的key,循环往复,
直到过期key的比例下降到25%或者这次任务的执行耗时超过了25毫秒,才会退出循环;
懒惰:只有当访问某个key时,才判断这个key是否已过期,如果已经过期,则从实例中删除;
如果redis配置了主从,这两种删除,只会在master中执行,然后通过del key的方式同步到slave
10 Redis淘汰策略
volatile -- 从已设置过期时间的数据集中挑选
allkeys -- 从数据集中挑选
volatile-lru、volatile-ttl、volatile-random、volatile-lfu
allkeys-lru、allkeys-lfu、allkeys-random、no-enviction(驱逐)
我们选用的是volatile-lru,key都是有过期时间的且有明显的时间轴特征
11 Redis AOF RDB
都是数据备份持久化机制,一个增量一个全量,一般从节点挂载时需要RDB搞一次全量数据,之后AOF增量更新就行
开启后不要绑定CPU,部署在物理机上,同时持久化最好在从节点执行
非必要就不要开启了,注意AOF刷盘用1s间隔的
如果JVM每分钟GC时间长达几秒,请结合JVM内存结构分析一下可能存在的问题?大家来分析下
12 JVM垃圾回收过程
13 RocketMQ
消息不丢 | producer同步发送,等broker返回完成才继续,失败一直重试直到成功 broker同步刷盘,且同步从节点完成才返回成功 consumer只有消费成功才主动ack给broker | 上述方案会导致性能大大下降,线上一般是异步刷盘 容忍极端情况下机器恰巧重启或损坏出现少部分丢失 |
消息顺序 | producer将同订单放到一个线程用hash路由到固定queue发送 broker本身保证了接受和存储的顺序 consumer单线程处理某个queue得来的数据 | 可能会导致部分queue数据倾斜严重 处理失败无法跳过 |
消息去重 | 若网络抖动导致ack没有回传成功,导致重试 | 消费方要做幂等 |
消息堆积 | 生产速率远大于消费速率(消费IO密集) 部分queue没有被consumer处理(再平衡时) 临时用新topic承接积压(队列 Broker大大高于旧topic) 问题修复上线消化 | 消费端做好积压监控 扩展消费者(大于队列数后无效) 扩展Borker+Consumer 多线程并行处理、批量处理 |
消息延时 | 比如消息到达处理依赖数据要等10分钟,则转发10分钟延迟再处理 同类可以用DB任务扫描,但是性能差些,不过时间精度可控 | 不支持任意时间精度,支持特定的 level,例如定时 5s,10s,1m |
死信队列 | 投递失败超过(默认16次)将投到死信队列进行人工干预 | |
事务消息 | 两阶段提交思想: redoLog也是如此,分prepared和commited状态 只有等binlog写入完成,对应记录才是committed msg一阶段是half不可消费,第二阶段根据本地事务处理结果来commit或roolback | |
架构高可用 | 多主多从部署 主:读写 从:只读 多主防止单点故障 从防止主挂掉未消费数据丢失 |
13 一致性Hash算法
普通hash算法:hash(key) % n。这时候如果一台服务器宕机或新增一台服务器,那么我们的n值就会变,这样就会导致我们所有的请求都会变更
一致性hash算法
哈希环:对2^32取模,将整个环组织成0-2^32-1
将服务器(ip+端口)hash,映射到环上一个节点。当请求到来时,根据key-hash映射到环上,顺时针选取最近的一个服务器进行请求
虚拟节点:当环上服务器较少时,会出现分配不均匀的情况,为了避免这种情况引入虚拟节点。比如通过添加后缀的方式给物理节点克隆出三个虚拟节点,如果两台物理节点,都克隆三个虚拟节点,那么环上就一共有8个节点。只是被克隆的虚拟节点最后还是会定位到实际物理节点上,但是可以有效的分摊请求。
一致性哈希相对于普通hash,优点在于映射到环上的其请求,是发送到环上离他最近的一个服务器,如果我们一台服务器宕机或者新增一台服务器,那么影响的请求只有这台服务器和前一个服务器节点之间的请求,其他的并不会影响。
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)