# Redis实现分布式锁 *** ## 什么是分布式锁? 本地锁:在多个线程中,保证一个线程执行 分布锁:在分布式jvm中,保证只有一个线程执行 ## 分布式锁实现方案 * 基于数据库方式实现 * 基于zk方式实现 * 基于redis方式实现 ## 分布式锁的应用场景有那些 1. 分布式任务调度平台保证任务的幂等性。 2. 分布式全局id的生成 ## Redis分布式锁实现思路---单机 Redis实现分布式锁基于SetNx命令,因为在Redis中key是保证是唯一的。所以当多个线程同时的创建setNx时,只要谁能够创建成功谁就能够获取到锁。 Set 命令 每次set时,可以修改原来旧值; SetNx命令 每次SetNx检查该 key是否已经存在,如果已经存在的话不会执行任何操作。返回为0 如果已经不存在的话直接新增该key。 1:新增key成功 0 失败 获取锁的时候:当多个线程同时创建SetNx k,只要谁能够创建成功谁就能够获取到锁。 释放锁:可以对该key设置一个有效期可以避免死锁的现象。 > 在提交事务的时候可以检查锁是否已经超时(就是endtime-strattime),进行手动回滚 ## Zookeeper实现分布式锁思路 Zookeeper实现分布式锁核心采用临时节点+事件通知,因为zk节点路径是保证全局唯一的,当多个线程同时创建该临时节点,只要谁能够创建成功谁就能够获取到锁。 获取锁:当多个线程同时创建该临时节点,只要谁能够创建成功谁就能够获取到锁。 释放锁:关闭当前Session连接,自动的删除当前的zk节点路径,其他线程重新进入到获取锁阶段。