Java五年经验压力面看你能撑到第几轮
我看你项目中写到用了分布式锁,具体是什么场景要用分布式锁?秒杀抢库存。那你们分布式锁怎么实现的?用redis的setnx命令结合lua脚本。那用 Redis 的 setnx 命令实现分布式锁时,抢到锁的线程挂了,锁该怎么释放?加过期时间。那给 Redis 分布式锁加了过期时间后,解锁时能直接删除锁 key 吗?为什么?存储 Redis 分布式锁时,value 为什么要用 “线程 ID+UUID”,仅用线程 ID 不行吗?解锁时 “先查锁的 value 是否为自己的,再删除锁” 这两步操作存在什么问题?原子性问题。那怎么解决这两步操作的原子性问题?Redis 执行 Lua 脚本为什么是原子性的?“业务没执行完但 Redis 分布式锁已过期” 的问题怎么解决?加看门狗线程定时延期。那看门狗线程怎么保证 Redis 分布式锁的过期时间总比业务执行时间长?怎么防止看门狗在业务线程挂了之后还一直给 Redis 分布式锁续期?你们设计的分布式锁支持可重入吗?什么业务场景需要支持加锁可重入?怎么实现分布式锁的可重入性?在 Redis 中用 Hash 结构实现可重入分布式锁时,key、field、value 分别是什么?如何进行加锁和解锁操作?没抢到分布式锁的线程是直接返回还是等一会儿再试?如果是等一会再试,那怎么实现才能避免线程自旋导致的 CPU 消耗过高和 Redis 压力过大问题?如何利用 Redis 的发布订阅功能实现高效的阻塞式分布式锁?Redis 主从架构下,锁丢失的具体场景是什么?红锁(Redlock)方案是怎么解决 Redis 主从架构锁丢失问题的?红锁方案中,加锁成功的条件是什么?红锁方案存在什么问题?大部分公司不用红锁时,是怎么处理 Redis 主从架构锁丢失风险的?ZooKeeper 的分布式锁相比 Redis 分布式锁,在主从问题上有什么优势?性能上有什么差异?设计跨多节点加锁的分布式锁时,需要考虑时钟同步问题吗?为什么?Java 的 GC 卡顿会对分布式锁造成什么影响?