1
0

4.基于redis实现分布式锁.md 1.7 KB

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节点路径,其他线程重新进入到获取锁阶段。