当前位置: 首页 > article >正文

分布式锁-redis实现方案

分布式锁的定义

        分布式锁(Distributed Lock)是分布式系统中的一种同步机制,用于控制对共享资源的访问。在分布式环境中,由于多个服务实例或进程可能同时运行在不同的服务器上,传统的单机锁机制(如Java中的synchronized关键字或ReentrantLock)无法跨进程或跨服务器工作,因此需要一种新的机制来实现跨节点的同步控制,这就是分布式锁。

分布式锁的作用

  1. 并发正确性:确保在同一时间只有一个线程或进程能够访问某个资源,从而避免数据竞争和不一致性问题。
  2. 互斥性:分布式锁的基本功能,即一个服务实例获取锁后,其他服务实例不能获取该锁。
  3. 可重入性:一个线程或进程获取到锁之后,可以再次获取(多次获取)而不引起死锁。
  4. 锁超时:持有锁的线程或服务实例挂掉后,一定时间锁自动释放,避免死锁。

 基于Redis实现分布式锁

    使用 setnx 命令

        SETNX 是 Redis 数据库中的一个命令,全称是 "SET if Not eXists"。该命令用于在指定的 key 不存在时,为 key 设置指定的值。

        基本语法

SETNX key value

       返回值

  • 设置成功时,返回 1。
  • 设置失败(即 key 已存在)时,返回 0。

获取锁

        这种加锁的思路是,如果 key 不存在则为 key 设置 value,如果 key 已存在则 SETNX 命令不做任何操作。保证互斥非阻塞

  • 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
  • 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
  • 客户端A执行代码完成,删除锁
  • 客户端B在等待一段时间后再去请求设置key的值,设置成功
  • 客户端B执行代码完成,删除锁 

 释放锁

        手动释放,直接删除即可

                del key

 如果获取锁成功后服务宕机,永远不会释放怎么办?

解决方案:

        超时释放:获取锁时添加一个超时时间(需要利用expire命令给锁设置一个有效期)

setnx lock thread1  #尝试获取
expire lock 10   #设置有效期

 如果获取锁成功,expire之前服务宕机怎么办?

解决方案:要保证setnx和expire命令的原子性,redis的set命令可以满足,需要添加nx和ex的选项:

  • NX:与setnx一致,第一次执行成功
  • EX:设置过期时间
set key value [EX time秒] [NX]
set lock thread1 EX 10 NX

http://www.kler.cn/news/358428.html

相关文章:

  • 搭建localhost本地 ChatGPT 模型与总结
  • STM32+DHT11温湿度传感器(含完整代码)
  • apple watch 版本太高,自己的 iPhone 版本太低,无法绑定
  • 重定向 缓冲区
  • 如何在 React 中更新状态对象的某个值
  • 基于SSM果蔬经营系统的设计
  • 滚雪球学Redis[8.1讲]:Redis的扩展与未来发展
  • chatgpt搭建大模型技术知识解读与总结
  • 【力扣打卡系列】滑动窗口与双指针(盛最多水的容器)
  • 【C++】13.string类的底层
  • ACH支付详解,北美电商为何偏爱这一方式
  • 基于x86_64汇编语言简单教程2: 分析我们的样例
  • Python基础09
  • 微服务架构 --- 使用Sentinel来处理请求限流+线程隔离+服务熔断
  • 2024系统分析师考试---论区块链技术及其应用
  • 7.计算机网络_IP包头
  • No provider available from registry RegistryDirectory
  • LeetCode[中等] 80. 删除有序数组中的重复项 II
  • SQL Injection | SQL 注入 —— 报错盲注
  • STM32F4读写SD卡:填一填ST官方HAL库的坑