面试
先做下自我介绍
面试官:你说下Java有哪些锁?
按照机制区分的话,Java中包含的锁可以分为公平锁和非公平锁、乐观锁和悲观锁,独占锁和共享锁,还有什么无锁,偏向锁,轻量锁,重量级锁之类的吧
面试官:CAS是什么?怎么保证原子性,底层是否有锁?CAS的弊端是什么?
面试官:好,那你说下Synchroized的升级过程?
面试官:Volatile用过吧 ,有什么作用
修饰变量,保证多线程下修改共享变量对其他线程可见;禁止指令重排序
面试官:Volatile是怎么保证可见性的,原理是什么
基于缓存一致协议(MESI):
面试官:ThreadLocal说一说,咋解决内存泄露
面试官:聊一聊AQS,为什么 AQS 底层是什么
面试官:目标是实现两个线程交替打印,实现字母在前数字在后。
LockSupport,semaphore,countDownLatch,reentranlock+condition
面试官:线程池拒绝策略有哪些
CallerRunsPolicy:线程池之外的线程直接调用run方法执行,除非线程池shutdown
AbortPolicy:直接丢弃任务,抛异常,默认策略
DiscardPolicy :丢弃任务,不报错
DiscardOldestPolicy:抛弃阻塞队列最早的那个任务,把最新的任务重新放到队列中
**面试官:线程池如果线程空闲,哪个参数可以设置多久销毁 **
keepAliveTime
面试官:你有没有遇到过线上的一些故障什么的,举个例子,CPU飙升怎么处理?
排除网络断电等抽风的情况,一般线上问题都是业务代码出现问题或者访问量过高导致的,检查的方式也比较通用,就是经典的top命令查看异常的线程,然后再根据是否是VM Thread决定用jstack 还是jstat 命令作进一步的排查
数据库
面试官:说下MySQL吧,你了解它的索引结构吗?
数据库必问到的索引八股文,B+树
面试官:主键索引和非主键索引区别,索引覆盖怎么回事?
在innodb引擎中,非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,如果没有发生索引覆盖的情况,根据非主键索引查到对应的数据还需要到主键索引做一次回表查询。
索引覆盖指的是一个索引包含了所有需要的字段,不需要回表查了
面试官:如果有个联合索引a,b,然后order a asc, b desc,会用到索引吗
8.0之后的版本可以,之前的版本不支持desc排序
面试官:随着业务增长,数据库如何做优化的?
索引,分区,分库分表(业务去分;水平,垂直),读写分离。
一张表:20个字段。高频字段。水平拆。
2个高频,18几乎不用,垂直拆。
1000w,500w。没有标准。慢了就拆。
面试官:你们是怎么做sql优化的?
一般来说,针对sql的优化都是在业务代码开发前就要做好的,除了基本的表字段设计,在开发的过程还要针对业务方法输出对应的sql语句,然后做好对应的sql review以及explain分析,同时还要考虑到业务的访问量,如果过高的情况下是否需要走强制索引之类的优化
分布式锁:
怎么防止库存的超卖?
面试官:你用过Redis做分布式锁吗?,那你说说Redis分布式锁的核心要保证哪些因素?
加锁,解锁,给锁设置超时时间
面试官:分布式锁如果线程拿不到锁,直接就返回吗
不是,可以设置等待时间,比如Redisson就支持
面试官:分布式锁如果master挂了,然后锁没有同步到其他机器,这时别的线程也拿到锁了,怎么办
Redis做分布式并非绝对安全,最保底的方式就是保证业务幂等
面试官:如果锁即将过期,但业务没处理完,该怎么处理
可以参考Redission的看门狗设计,就是定时对即将失效的锁续期
面试官:幂等性和分布式锁是同时要的吗,为什么都有了幂等性还要加锁
分布式锁可以防止用户误操或者流量过高的情况,如果完全由业务幂等保底,可能会让流量都达到db(很好的问题)
面试官:说说缓存穿透是什么样子,怎么处理,跟缓存雪崩有什么区别?
缓存穿透:指缓存和数据库中都没有的数据,这样每次请求都会去查库,不会查缓存,如果同一时间有大量请求进来的话,就会给数据库造成巨大的查询压力,甚至击垮db系统。
一般解决方案有两种:
1、缓存空对象,但设置一个较短的时间,避免占用大量内存
2、布隆过滤器
缓存雪崩:大量的key同一时间失效,导致流量都打到db
解决方案一般是设置给key设置随机过期时间,或者互斥锁的方式抵挡请求
微服务:
面试官:springcloud介绍一下,有什么组件
说一下Eureka的自我保护机制
面试官:Nacos 核心流程
配置中心内容,主要了解:命名空间+DataID+分组这三者关系,Nacos配置中心支持动态配置
面试官:Seata
分布式事务
两阶段提交协议:准备阶段 提交(回滚)阶段
项目
如果让您设计一个秒杀系统,怎么设计才能承受百万级并发?
面试官:项目安全如何保证的?
数据安全。防盗,防丢。(sha256, 敏感信息 对称加密,备份。权限) (加盐 salt。)定期更换。规定。法律。
业务安全。权限管理。?userId=2。 3 4 uuid。雪花算法,接口安全(https,加盐,防攻击)。
代码安全。错误提示。 e.printStack();。接口 做规范化的返回。
审计,安全扫描。
面试官:如何防止别人伪造我们的用户?
1。不让拿。-https
2。不用久用。-有效期
3。人机交互。国民级应用。
jwt token。
ip白名单。
通道安全。
token有效期。
同一账号如何挤掉另一个账号?
主动和被动。
主动:发消息,踢掉。
被动:更新服务端的token
面试官:如何保证系统稳定性
自己坏的,(备份-副本–集群。)
别人让我坏的。-其他服务坏了
隔离。
机器隔离
线程池隔离
信号量隔离。数字。
限流。
固定时间窗口
滑动时间窗口
令牌桶
漏桶。
熔断。
限流和熔断: