问题一:无限续期导致死锁怎么办
问题二:maven怎么用的,有啥功能
问题三:布隆过滤器知道原理吗?
问题四:mybatis只通过实现接口就可以运行的原因
问题五:看门狗机制
开始分析:
问题一:无限续期导致死锁怎么办
答:一般指 Redisson 分布式锁看门狗无限续期造成死锁。
第一,加锁时指定锁的最大过期时间leaseTime,会关闭自动续期,锁到时间自动释放,从根源防止无限续期;
第二,业务代码放到 try-finally,释放锁前判断是当前线程持有才解锁,避免漏释放;
第三,如果业务耗时不确定要用看门狗,就给业务加执行超时检测,线程阻塞卡死就终止续期; 第四,线上兜底方案:定时任务定期清理长时间未释放的僵尸锁,紧急情况直接删除 Redis 锁 key 恢复。
如果是本地 Lock 死锁,就用带超时的 tryLock,并且统一线程获取锁的顺序。
问题二:maven怎么用的,有啥功能
答:核心功能:
第一是依赖管理,通过 pom.xml 配置引入第三方 jar 包,自动下载、解决包冲突,不用手动导包; 第二是项目标准化构建,统一项目目录结构;
第三是项目生命周期管理,提供 clean、compile、test、package、install、deploy 等一套命令,完成清理、编译、测试、打包、上传私服全流程; 第四是多模块拆分,适合大型项目做分模块开发。
简单使用流程:先创建 Maven 项目,编写 pom.xml 配置依赖和插件;然后用命令执行构建,比如 package 打 jar/war 包;可以配置本地仓库、远程私服,还能自定义插件拓展构建逻辑。
问题三:布隆过滤器知道原理吗?
布隆过滤器底层是位数组 + 多个哈希函数。
- 存入数据:一个元素经过多个不同哈希函数算出多个下标,把位数组对应下标全部置 1。
- 查询数据:同样哈希算出下标,只要有任意一位是 0,元素一定不存在;全为 1 才判断可能存在。
- 特点 :不存在误判,但存在假阳性(有可能把不存在的元素误判为存在),无法删除元素;优点是占用内存极小、查询速度快,Redis 里常用来做缓存穿透解决方案。
问题四:mybatis只通过实现接口就可以运行的原因
MyBatis 仅定义接口不用写实现类就能运行,核心是动态代理,流程分这几步:
- 启动时解析 Mapper 接口和对应的 XML / 注解 SQL,把接口全限定名当作 key,把 SQL、参数、返回值等元数据封装存进配置;
- 调用
getMapper()时,MyBatis 底层用 JDK 动态代理生成这个 Mapper 接口的代理对象; - 调用接口方法时,会走到代理类的
invoke拦截方法; - 拦截器根据当前调用的接口方法,匹配提前缓存好的 SQL 信息,封装参数,执行 JDBC 数据库操作,最后把结果映射返回,我们就不用手写接口实现类了。
补充一句:因为是 JDK 动态代理,所以 Mapper 必须是接口,不能用普通类
问题五:看门狗机制
我说下 Redis 分布式锁里的看门狗机制:
- 触发条件:我们调用
lock()不加锁最大过期时间 leaseTime 时,Redisson 会自动开启看门狗;锁默认有效期 30 秒。 - 工作逻辑:后台起一个定时线程,每隔 10 秒检查,如果当前业务线程还持有锁,就自动把锁过期时间重置回 30 秒,实现自动续期,防止业务没执行完锁提前释放。
- 停止条件:只要业务线程正常走完、手动解锁,或者线程卡死终止,续期任务就会停止,锁到期自动删除。
- 缺点:如果业务线程卡死阻塞,看门狗会无限续锁,造成死锁;解决办法就是手动指定 leaseTime,关闭看门狗,给锁设置最大存活时长兜底。