面试过程都是一连串的连环Q——分布式锁篇

前言

记录一次面试的题和自己的一些理解,通常一般都是自我介绍,项目介绍,问问业务以及后面就是吧拉吧拉的技术细节,反正一句话 “面试过程都是一连串的连环 Q”。如果大家觉得这些问题都能够游刃有余的回答大家出去拿一个高级的 title 问题不大。

分布式锁部分

  1. redis 分布式锁超时后,第二个线程进入过后会有什么影响?
无法保证幂等,可能发生未知问题。
  1. 分布式锁锁超时如何实现?
主线程中,增加延迟队线程池实现。
  1. 2000 个线程持有锁如何续期呢?
框架实现:应该是一个定时任务。 redisson 使用的是 netty 提供的 TimerTask 延迟任务或者采用 ScheduledThreadPoolExecutor 就算是 2000 个任务,也不会开启两千个线程本质是通过优先级队列排排队
  1. 锁不设置过期时间有什么问题?
会造成死锁
  1. 分布式锁如何实现锁重入?
hash 实现,存储,keyid (uuid)

J.U.C 部分

  1. ReentrantLock 公平和非公平?
ReentrantLock 默认非公平,公平锁首先入队 AQS ,非公平锁会执行抢锁的逻辑。
非公平加锁过程
  • 直接加锁 (加锁)
  • 无锁加锁,判断重入 (加锁)
  • 入队前加锁(加锁)
  • pack
公平锁加锁过程
  • 无锁加锁,判断重入 (加锁)
  • 入队前加锁(加锁)
  • pack
  1. ReentrantLock 解锁过程?
解锁从队头唤醒,LockSport.unpark(threadId)
  1. synchronized 锁升级过程 ?
无锁,一个线程是偏向锁,轻量级锁,然后变为重量级锁。
  1. 偏向锁如何升级为轻量级锁?
存在多个线程抢锁的过程中。
  1. volatile 如何保证可见性?
通过 storeload 内存屏障实现的 在 hotsport 源码中,内部使用了 lock 指令
  1. 内存屏障怎么加的?
底层就是使用汇编的 lock 指令或者使用系统 api
  1. 读写屏障怎么加的?
读屏障,其实就是在读取之前加读屏障,设置 CPU 缓存失效,在主内存中读取数据 写屏障,其实就是在写数据之后加写屏障,将 CPU 的缓存数据,刷入主内存

Redis 部分

  1. redis 过期策略?
lru , lfu 区别
  • lru 优化 , lru-1 ==> lru-k 就是说一个历史队列,和一个缓存队列 冷热数据分离,优先清理冷数据
  • lfu 存在问题,就是会有一个引用计数,内存占用很高。
  1. key 失效策略?
惰性删除 定时删除 (key 增加一个定时) 定期删除 (固定周期删除)
  1. redis 高可用集群
sentinel 和 redis cluster 集群
  1. 集群的区别?系统中如何选择?(什么时候用 redis sentinel? 什么时候用 redis cluster?)
区别: redis sentinel 只有一个主节点。 redis cluster 多个主节点,能够提供强的服务能力。
  1. redis cluster 如何重新选举,选举过程中,需要考虑那些因素?
  2. 如果 salve 发现 master 不可用
  3. id 增加 记录集群的 currentEpoch + 1, 广播 FAILOVER_AUTH_REQUEST 信息
  4. **客户端应答(主节点参与选举):**收到其他其他的节点信息,每个节点都发一个 ack
  5. 过半机制,确认选举成功
  6. 最后广播到所有的节点
  7. redis 集群模式下,如何指定两个 key 在一个槽或者节点中。
Redis Cluster在计算hash slot的时候,会同时计算一个特例就是 hash tag。这个作用是什么呢?是确保两个键都在同一个哈希槽里。举个例子: mset {user1}:1:name zhangsan {user1}:1:age 18 只会通过 user1 来计算。

MySQL 和索引

  1. 复合索引 a,b 列,查询命中两条数据索引中数据查询过程?
按照最左前缀原子匹配索引数据,匹配到了,一个复合索引的叶子节点,关联的是一批主键id , 然后回表查询数据。
  1. mvcc 机制?
mvcc 机制,是一个并发访问控制, 针对读已提交,可重复读的事务隔离级别。 在读已提交 ,能够读取到最新的数据,能拿到这条数据读取的一个事物提交的版本链。 在可重复读 ,会记录事务开启后的第一个读取的 viewid 所以就可以保证重复。
  1. binlog, redo log undo log 发生的顺序。
binlog 是数据库 server 级别的 redo log undo log 是引擎级别的。 binlog 是在事务提交的时候才会去刷盘

编辑切换为居中
添加图片注释,不超过 140 字(可选)

  1. 如果事务提交了 binlog 没有记录成功会怎么样?
binlog 记录成功才标志事务提交成功。 参考同上

Spring 部分

mybatis 的 bean 如何被注入的? 其实会更具 spring-starter 机制在 spring-boot 启动的时候,初始化配置类。
@mapper 注解如何被是转换为 bean 的 其实这里主要是通过 MapperFactoryBean 生成一个代理对象,然后注入进去。

如果觉得本文对你有帮助,可以转发关注支持一下
最后的最后如果大家需要领取这套面试资料麻烦帮忙点赞+转发文章之后私信我【面试】两个字领取就可以了!
或者直接添加小助理微信:mxk6072 为你免费赠送更多面试题库
全部评论

相关推荐

2025-12-12 19:01
南京航空航天大学 C++
秋招没咋投,准备 wxg 转正之后摆烂了。结果不堪字节 HR 的骚扰还是面了一下字节。之前想去字节的时候怎么面都挂。现在想着随便面一下结果三面技术面都意外顺利还有加面。十月中旬字节发了意向,wxg 转正结果无响应。十月底字节拉了保温群,wxg 口头通过,系统显示考核中。十一月初和字节 ld 交流之后得知 base 居然能选海外,甚至能小 wlb 一下,wxg 无响应无人联系。十一月中旬把字节 base 转到了海外,wxg 流程灰了,一问超时忘处理了,过两天又变考核中了。十一月下旬字节换了海外 HR 对接,问了期望薪资,wxg 考核终于显示通过,无 HR 保温,无其他保温。十一月底给字节报了个天价,想吓吓他们,同时告诉微信字节要开了,微信无响应。同样十一月底字节 HR 告诉我确实给不到那么高,但是能拿期权补上,问能不能接受。微信无响应。同样十一月底字节 HR 告知了具体方案,符合预期。 微信无响应。十二月上旬催 wxg 不开我就盲拒了,wxg HR 火急火燎的打电话问情况,问期望。我给了一个不算夸张的总包数字,因为今年市场在涨,过了三天还不联系我,我再催,约时间下午打电话,非得在我给出的数字上压下去几万,微信又不差这点,为什么不能满足我,让我没有拒绝的理由呢?一番纠结抗争,求稳还是追求挑战,最终选择接受迎接新的挑战,因为堂吉诃德永远不会停下脚步!回想起来,在 wxg 谈薪的阶段,我认为并没有给予我一定的重视,即使 HR 表示我在实习期间的表现和之前的面评都很靠前。也没有感觉到想要争取我,虽然我表示拒了 offer 之后要给我加面委定 t6 再涨,但我三个月没面试让我面面委那就是白给,还是算了。有缘再见了我亲爱的 wxg,再见了曾经的梦中情厂,再见亲爱的 mt,再见亲爱的朋友们。也再见,北京的一切。我想润了。秋招结束,卸载牛客,下一个三年,下一个五年,下一个十年后再来看看。
面试中的大熊猫爱吃薯...:我嫉妒得狗眼通红
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务