Loading

基于 Redis 实现分布式锁

1、主流分布式锁实现方案

  • 基于数据库实现分布式锁

  • 基于缓存(redis 等)

  • 基于 Zookeeper

2、根据实现方式分类

  • 类 CAS 自旋式分布式锁:询问的方式,类似 java 并发编程中的线程获询问的方式尝试加锁,如 mysql、redis。
  • event 事件类型分布式锁: event 事件通知进程后续锁的变化,轮询向外的过程,如 zookeeper、etcd*

3、Redis 实现分布式锁流程

  • 设置过期时间,自动释放锁,为了解决业务异常而导致锁无法释放。(但是当业务运行超过过期时间时,开辟监控线程增加该业务的运行时间,直到运行结束,释放锁。)
  • 锁和过期时间一起设置保证两者原子性
  • uuid, 手动释放锁前获取锁的值,防止误删锁

4、实现伪代码

public void redisLock() throws InterruptedException {
  String uuid = UUID.randomUUID().toString();
  ValueOperations ops = redisTemplate.opsForValue();
  Boolean lock = ops.setIfAbsent("lock", uuid, 3000, TimeUnit.SECONDS);
  if (lock) {
    System.out.println("执行业务代码");
    if (uuid.equals(ops.get("lock"))) {
      redisTemplate.delete("lock");
    }
  } else {
    Thread.sleep(100);
    redisLock();
  }
}
posted @ 2022-04-15 09:32  Eajur  阅读(153)  评论(0)    收藏  举报