解读分布式锁(redis实现方案)

这篇具有很好参考价值的文章主要介绍了解读分布式锁(redis实现方案)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.导读

分布式锁是一种用于分布式系统中的并发控制机制,它用于确保在多个节点或多个进程之间的并发操作中,某些关键资源或代码块只能被一个节点或进程同时访问。分布式锁的目的是避免多个节点同时修改共享资源而导致的数据不一致或冲突的问题。通俗的来说,分布式锁的出现是为了解决分布式系统的问题,如果是单系统可以使用synchronized来完成资源的锁定,而如果是多系统环境,这个关键字只能控制本地的资源,由此诞生了分布式锁。

2.实现

初级版本1.1 

使用sentx对系统进行上锁,setnx是redis中提供的命令,主要作用是set一个key,但是区别set的操作是,nx代表的是not exit(不存在)即不存在才能set成功,存在会失败报nil。上锁之后就是正常的执行业务代码,执行完毕过后释放锁。而如果线程setnx失败的话,线程应该睡眠1s然后自旋,也就是重新递归调用自己,重复以上操作,睡眠是为了防止压力过大。具体setnx命令为set lock 123 NX,可以自己试试。

解读分布式锁(redis实现方案),spring boot,分布式,redis,数据库 

 升级版本1.2

思考:上面逻辑有什么问题?如果设置成功后,去执行代码,出现了异常或者业务闪断,是不是锁没有正常得到释放,这样B或者其他人都会一直无法使用,形成死锁,这个时候是不是就有聪明的人想到了使用过期时间expire。命令 

EXPIRE key seconds

 解读分布式锁(redis实现方案),spring boot,分布式,redis,数据库

 升级版版本1.3

同样上面设置同样会有问题,问题就出在设置过期时间这个环节可能也会出错,无法正常执行,这同上也会出现释放锁受阻,因此设置过期时间应该和setnx同属于原子操作,这样就算失败了也并没有设置上锁。具体操作是采用命令

set lock 123 Ex 30 NX

解读分布式锁(redis实现方案),spring boot,分布式,redis,数据库 

 升级版本2.1

关于删除lock释放锁的操作的问题

思考:如果你的业务时间非常长,A执行代码过程需要40s,但是你设置的过期时间是30s,然后B因为你的key过期,会马上获取到锁的资源,然后这个时候A又到了30s,会执行释放锁的操作,肯定会释放到B的线程的锁,释放了其他线程也会马上进入,就会造成多个线程在执行同一个锁的操作,完全没有实现锁的特性。

实现:考虑实现使用UUID去设置值,在释放锁的时候先去获取锁的值,如果能够匹配上UUID就执行删除锁的操作。

解读分布式锁(redis实现方案),spring boot,分布式,redis,数据库 

 升级版2.2

注意:if(get(lock) == UUID){del(lock)} 这段代码一般是由Java客户端在执行,这个时候就会出现非常致命的问题,get(lock)的过程中是Java端在像Redis过程中请求,假如你现在能够获取到lock的UUID,是属于A线程(本线程)的UUID的,但是在返回过程中,恰好又出现了过期时间过期了,这个时候B线程就会马上进入锁,执行后续操作!!!!问题来了,这个时候A以为自己还是成功获取到了,所以会删除lock,但是这个时候就会删除到B的lock,会出现上述现象。本质的产生就是释放锁(删除锁)的操作不是原子性的。

解决:lua脚本  官方的代码 KEYS[1] 就是lock 而 ARGV[1] 是UUID

if redis.call("get",KEYS[1]) == ARGV[1]
then
    return redis.call("del",KEYS[1])
else
    return 0
end

 这个本质你可以看成在redis内执行了获取key和删除的操作,所以并不存在Java客户端到Redis有往返造成的判断和删除非原子的情况。

 解读分布式锁(redis实现方案),spring boot,分布式,redis,数据库

 文章来源地址https://www.toymoban.com/news/detail-617861.html

 

 

到了这里,关于解读分布式锁(redis实现方案)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 集成 Redisson 实现分布式锁

            Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库,可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面,例如分布式锁、分布式集合、分布式事件发布和订阅等。本篇

    2024年02月08日
    浏览(40)
  • 【Java】三种方案实现 Redis 分布式锁

    setnx、Redisson、RedLock 都可以实现分布式锁,从易到难得排序为:setnx Redisson RedLock。一般情况下,直接使用 Redisson 就可以啦,有很多逻辑框架的作者都已经考虑到了。 1.1、简单实现 下面的锁实现可以用在测试或者简单场景,但是它存在以下问题,使其不适合用在正式环境。

    2024年02月05日
    浏览(51)
  • Redis分布式可重入锁实现方案

    在单进程环境下,要保证一个代码块的同步执行,直接用 synchronized 或 ReetrantLock 即可。在分布式环境下,要保证多个节点的线程对代码块的同步访问,就必须要用到分布式锁方案。 分布式锁实现方案有很多,有基于关系型数据库行锁实现的;有基于ZooKeeper临时顺序节

    2024年02月19日
    浏览(43)
  • Spring Boot实现分布式事务的协调和管理

    在现代的分布式系统中,往往存在多个服务协同完成一个业务操作的情况。而在这种情况下,如何保证所有服务的数据一致性成为了一个重要的问题。Spring Boot作为一个流行的Java开发框架,提供了多种方法来实现分布式事务的协调和管理。本文将介绍一些常用的方式和技术来

    2024年02月08日
    浏览(42)
  • spring boot 实现Redisson分布式锁及其读写锁

    分布式锁,就是控制分布式系统中不同进程共同访问同一共享资源的一种锁的实现。 1、引入依赖 2、配置文件 3、配置类 4、测试代码 5、理解 一、时间设置 默认 lock() 小结 lock.lock (); (1)默认指定锁时间为30s(看门狗时间) (2)锁的自动续期:若是业务超长,运行期间自

    2024年02月12日
    浏览(38)
  • # Spring Boot 中如何使用 Spring Cloud Sleuth 来实现分布式跟踪?

    在微服务架构中,通常会有多个服务相互协作,为了方便排查问题,我们需要对服务之间的调用进行跟踪。Spring Cloud Sleuth 是 Spring Cloud 生态中的分布式跟踪解决方案,它可以帮助我们追踪请求在微服务系统中的传递路径,以及记录每个服务的处理时间等信息。 本文将介绍如

    2024年02月08日
    浏览(59)
  • Spring Boot如何实现分布式系统中的服务发现和注册?

    随着互联网的快速发展,越来越多的企业开始将自己的业务迁移到分布式系统中。在这种情况下,服务发现和注册变得尤为重要。对于分布式系统中的每个服务来说,它需要知道其他服务的位置和状态,这样才能进行通信和协作。Spring Boot提供了一些工具和框架,可以帮助我

    2024年02月07日
    浏览(41)
  • Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 数据聚合

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 本篇文章将讲解 Elastic Search 如何实现数据聚合,以及 在项目实战中如何通过数据聚合实现业务需求并完成功能。 以下为官方

    2024年02月11日
    浏览(45)
  • Zookeeper 和 Redis 哪种更好? 为什么使用分布式锁? 1. 利用 Redis 提供的 第二种,基于 ZK 实现分布式锁的落地方案 对于 redis 的分布式锁而言,它有以下缺点:

    关于这个问题,我们 可以从 3 个方面来说: 为什么使用分布式锁? 使用分布式锁的目的,是为了保证同一时间只有一个 JVM 进程可以对共享资源进行操作。 根据锁的用途可以细分为以下两类: 允许多个客户端操作共享资源,我们称为共享锁 这种锁的一般是对共享资源具有

    2024年01月16日
    浏览(49)
  • Redis实现分布式锁之----超时和失效(非原子性)问题----解决方案

    Redis实现分布式锁之----超时和失效(非原子性)问题----解决方案 超时和失效(非原子性)问题 原子性问题 :上锁时存入线程名称,删除时要先判断锁内的名称是不是自己的,是再删除,但是后面的判断 和删除非原子性 ,会有并发安全问题。 不可重入问题 :一个线程只能

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包