Java面试宝典 一问一答(第一期)(java面试问题大全及答案大全 word)
mhr18 2024-11-16 23:25 17 浏览 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,优点在于映射到环上的其请求,是发送到环上离他最近的一个服务器,如果我们一台服务器宕机或者新增一台服务器,那么影响的请求只有这台服务器和前一个服务器节点之间的请求,其他的并不会影响。
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- 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)