
Redis 分布式锁目的同一时刻只有一个客户端可以执行业务可以保证只有一个客户端拿到锁。本质利用 Redis 的原子命令只有 key 不存在才设置成功。作用让多个服务实例去竞争同一把全局锁。加锁方式SET lockKey requestId NX PX 30000需要解决的问题加锁原子性锁自动过期避免客户端异常退出锁不释放防误删业务超时后的续期基础追问① SET 命令里 NX、PX、requestId 分别是什么作用NXNo exist。key 不存在才设置实现互斥。PX毫秒级设置过期防止客户端宕机死锁。 requestId客户端唯一标识防止误删别人锁标记锁是谁加的。② 解锁为什么不可以 GETDEL 两行代码GET 与 DEL 不是原子性操作。GET 判断是自己的锁刚执行完 GET锁就过期被别人抢走再 DEL 就删掉别人锁。 Lua 脚本保证 判断 删除一次性原子执行。③ 分布式锁要满足的 4 大特性互斥同一时刻只有客户端可以拿锁。防死锁锁自带过期时间客户端崩溃也能释放。原子性加锁 / 解锁原子。安全性持有者只能删自己的锁防误删。灵魂难点① 单点 Redis 在主从架构下分布式锁有什么缺陷主节点加锁成功锁还没异步同步到从节点主节点宕机。哨兵做主从切换从升级成新主。新主没有这条锁记录其它客户端可以再次拿到锁。 结果两个客户端同时持有锁并发失效。简记主从异步复制锁未同步就宕机锁丢失。② Redis 分布式锁能不能做到绝对安全不能。主从切换是原生单点 Redis 锁的硬伤。 资金、强一致性业务Redis 只做前置处理必须数据库乐观锁 / 事务兜底。Redisson① 看门狗 watch dog 默认锁 30s后台线程每 10s 检查一次。逻辑业务线程还在运行自动续期锁为 30s。业务结束→停止续期。特点代码中指定过期时间→看门狗失效不指定过期时间→看门狗开启。② Redisson 可重入锁底层原理 同一线程可以多次获取同一把锁。Redis value 存线程 ID 重入计数。Lua 逻辑 加锁Key 不存在则创建计数 1是当前线程计数 1否则抢锁失败。解锁计数 - 1计数 0 只减计数不删 key计数减到 0删除 key 释放锁。③ tryLock (waitTime,leaseTime) 两个参数区分 waitTime最多等待多久去抢锁。 leaseTime锁持有过期时间。Redis 分布式锁 vs Zookeeper 分布式锁Redis性能高TTL 过期主从切换存在丢锁风险适合高并发允许极小概率故障场景Zookeeper临时节点会话断开自动释放锁强一致性不丢锁性能低适合强一致性场景什么场景用 Redis 分布式锁集群定时任务防止多个实例重复跑任务库存扣减接口防重复提交业务执行 time 超过锁过期时间会发生什么How to solve?现象锁过期释放其它客户端抢锁老线程继续执行任务并发冲突。解决简单场景预估业务时长设置足够大 TTL业务时长不可估Redisson 看门狗自动续期兜底业务层加状态标记即使锁失效也不修改数据。Redis 布隆过滤器what高空间效率的概率型数据结构。用处用来判断一个元素可能存在或一定不存在。底层位数组 哈希函数。好处在海量数据场景下占用很小内存查询 O (1)。缺点可能误判元素存在不会误判不存在。 不存完整数据 → 做完整存在性判断。Redis 的主从同步如何实现从节点与主节点建立复制连接后发送 PSYNC 请求主节点根据复制 ID 和偏移量决定走全量同步还是增量同步全量同步发生时间首次复制、从节点刚上线或增量数据已经追不上的场景。步骤主节点会 BGSAVE 生成 RDB 发给从节点从节点加载 RDB 后再接收这段时间积压的指令。增量同步发生时间断开短暂重连场景。步骤从节点把自己记住的 replid 和 offset 发给主节点只要主节点的 backlog 还保留缺失数据直接补发不必全量复制。二、关键词速记Redis 分布式锁加锁命令SET lockKey requestId NX PX 30000NXkey 不存在才设置互斥 PX毫秒过期防宕机死锁requestId客户端唯一标识防误删四大特性互斥、防死锁、原子性、安全性解锁禁止 GETDELLua 脚本原子判断删除主从缺陷主从异步复制锁未同步主宕机哨兵切换锁丢失并发失效安全性无法绝对安全强一致业务 Redis 前置数据库乐观锁兜底Redisson看门狗 watch dog默认锁 30s每 10s 续期指定 leaseTime 看门狗失效可重入锁value 存储线程 ID 重入计数Lua 脚本实现加减计数 tryLockwaitTime 抢锁等待时长leaseTime 锁过期时间Redis 锁 vs ZK 锁Redis性能高TTL 过期主从丢锁风险高并发容忍极小概率异常ZK临时节点会话断开自动释放强一致性能低强一致场景适用场景集群定时任务防重复、库存扣减、接口防重复提交业务超时问题锁过期并发冲突方案预估 TTL、看门狗续期、业务状态标记兜底布隆过滤器概率型数据结构底层位数组 哈希函数作用判断元素一定不存在 / 可能存在优点海量数据内存占用小查询 O (1)缺点存在误判判断存在不一定真实存在不存储完整数据Redis 主从同步PSYNC复制 ID、偏移量 offset全量同步首次上线 / 增量追不上BGSAVE 生成 RDB 传输补发积压指令增量同步短暂断连主 backlog 缓冲区补发数据无需全量 RDB