《分布式锁》
场景通常在多消费者单数据源的情况下需要使用分布式锁多个消费者或者说多个线程、多个进程、多个服务实例等需要对单个数据源或者说共享资源、关键操作等进行访问和操作需要确保在同一时间只有一个消费者能够访问数据源从而避免数据不一致或者操作冲突。集群下的任务调度在分布式任务调度系统中可能会存在多个调度节点同时竞争执行同一个任务的情况。使用分布式锁可以确保同一时间只有一个调度节点能够执行某个任务避免任务的重复执行或者并发执行。分布式事务管理在分布式事务场景中可能需要对多个资源进行操作确保所有资源的操作要么全部成功要么全部失败。使用分布式锁可以实现分布式事务的并发控制和资源管理确保事务的一致性和可靠性。并发限流在高并发系统中可能需要对某些关键操作进行并发限流避免系统被过多的请求压垮。使用分布式锁可以控制并发访问的数量确保系统的稳定性和可用性。主流使用了redis或者zookeeper来实现分布式锁SET NX PX UUID Lua 自动续租 可靠常用 需要自己实现Redisson 功能完整生产常用 引入依赖有额外复杂度Redis 分布式锁方案对比方案一SET NX PX UUID Lua手写 Redis 分布式锁解决的问题保证多个服务实例同时竞争同一资源时只有一个实例执行。方案核心解决点问题解决方式多人抢锁NX保证只有一个请求成功获取锁服务宕机导致死锁PX设置过期时间锁自动释放误删别人锁UUID Lua校验锁持有者身份Redis操作并发问题Lua脚本保证判断和删除原子执行核心流程1. SET lock_key uuid NX PX 30000 ↓ 成功 获取锁执行业务 失败 等待/重试 ↓ 2. Lua释放锁 判断 当前value uuid 是 删除锁 否 不操作方案二Redisson 分布式锁使用方式lock.lock();try{// 业务代码}finally{lock.unlock();}解决的问题在SET NX PX UUID Lua基础上解决业务复杂场景下锁生命周期管理问题。方案核心解决点问题解决方式基础互斥Redis 分布式锁保证同一资源只有一个线程执行锁提前过期WatchDog 自动续期业务未完成时延长锁时间释放错锁通过线程 ID 校验只释放当前线程持有的锁多个线程等待提供阻塞等待机制避免频繁轮询重复加锁支持可重入锁同一线程可以多次获取同一把锁