redis学习笔记(19)分布式锁

1、概述

随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程的特点以及分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的 Java API 并不能提供分布式锁的能力。为了解决这个问题就需要一种跨 JVM 的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!

2、分布式锁主流的实现方案

  1. 基于数据库实现分布式锁
  2. 基于缓存(Redis 等)
  3. 基于 Zookeeper
  • 根据实现方式,分布式锁还可以分为类 CAS 自旋式分布式锁以及 event 事件类型分布式锁:
    • 类 CAS 自旋式分布式锁:询问的方式,类似 java 并发编程中的线程获询问的方式尝试加锁,如 mysql、redis。
    • 另外一类是 event 事件通知进程后续锁的变化,轮询向外的过程,如 zookeeper、etcd。
  • 每一种分布式锁解决方案都有各自的优缺点:
    • 性能:redis 最高
    • 可靠性:zookeeper 最高

3、使用 redis 实现分布式锁

  • 使用setnx上锁,使用del释放锁;
  • 为了避免锁一直不释放,使用expire给锁设置一个过期时间,自动释放;
  • 使用set key value nx ex 10可以同时上锁和设置过期时间;
  • 使用uuid防止误删锁,造成没锁的情况,具体步骤如下:

1)使用set key value uuid nx ex 10命令给锁生成uuid;

2)释放锁的时候,判断当前的uuid和要释放的uuid是否一样。

4、LUA保证删除的原子性

 

 参考:(29条消息) redis 14 分布式锁(UUID防误删、LUA脚本保证删除的原子性、锁的实现原则)_但行益事莫问前程的博客-CSDN博客

posted @ 2022-05-03 15:29  ☞@_@  阅读(44)  评论(0编辑  收藏  举报