分布式锁的场景以及实现方案_redis分布式锁使用场景

分布式锁的场景以及实现方案_redis分布式锁使用场景分布式锁应用场景/实现方案

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

工作中用到了分布式锁,特意研究了下各种场景和实现方案。

为什么用分布式锁?

其实提到锁这个东西,我理解它有点类似现实生活中的锁。

举个例子:比如门锁,现实生活中我们为什么用门锁,因为防止更多人进去。

那结合到我们编程中来道理也是一样的,在一些特定场景,一些特定的资源是有限的。(比如库存等)这个时候我们要加上锁,其实可以理解成钥匙,有锁钥匙的人才能走下面的流程

应用场景:

1.最常见扣减库存

2.缓存击穿/缓存雪崩(也可以采用分布式锁)

3.在高并发的场景下,阻止流量打到后边等等

实现方案:

1.利用mysql实现分布式锁

1.创建锁表,利用唯一性约束,获取锁时插入数据库。

2.释放锁时,删除数据

优点:容易理解,实现简单

缺点:性能比较差,适合并发不高的场景

2.基于redis setnx实现分布式锁

1.主要设置锁的超时时间,避免死锁
2.如果锁过期了事情没干完-使用多线程(守护线程)延长过期
3.为了保证原子性操作,实现的时候采用Redisson(API实现比较简单/源码中加锁/释放锁操作都是用 Lua 脚本完成的,封装的非常完善,开箱即用)

优点:redis的性能很高,可以支撑高并发的获取、释放锁操作。

缺点:集群环境下,主节点宕机时,两个线程会拿到锁
     其实需要自己不断去尝试获取锁,比较消耗性能。

3.基于redLock实现分布式锁

1.RedLock 算法虽然是需要多个实例,但是这些实例都是独自部署的,没有主从关系。
RedLock 作者指出,之所以要用独立的,是避免了 Redis 异步复制造成的锁丢失,
比如:主节点没来的及把刚刚 Set 进来这条数据给从节点,就挂了。如上面第二点说的
问题

2.红锁算法认为,只要 2N+1 个节点加锁成功,那么就认为获取了锁。
3.集群有5台节点三个节点加锁成功并且花费时间小于锁的有效期
4.认定加锁成功了

缺点:有一台机器重启,有两个线程拿到锁(概率很低)

4.基于zookeeper实现分布式锁

加锁流程

首先在zookeeper创建根节点,也就是持久节点(rootNode),作为锁节点
在根节点(rootNode)下创建临时节点(node_x):
查询根节点的子节点列表,检查如果当前创建的节点的序号是最小话,就认定该客户端已经获得锁
如果不是最小的节点,说明获取锁失败,此时客户端就要找比自己小1的节点(node_x-1),
对其注册事件监听器(等待node_x-1的节点被删除的时候,通知当前节点获取锁)
获取锁的客户端在执行完业务就删除当前最小节点。删除最小节点后客户端会通过监听器收到通知,
然后再次判断是否自己的节点最小,是的话进行加锁,不是的话重复上述操作

释放锁流程

等待获取锁的客户端执行完业务流程,直接删除当前的最小的临时顺序节点(L)即可
这样监听L的删除事件的客户端,就会被通知到,尝试进行锁的获取

优点:zookeeper天生设计定位就是分布式协调,强一致性。锁的模型健壮、简单易用、适合做分布式锁。
如果获取不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。

缺点:代码通过Watcher机制实现,实现相对复杂

上面介绍了目前主流做分布式锁的方案,咱们在做技术选项和对比的时候.根据实际应用场景选择合适的方案把。其实用的比较多直接单独用一台redis来做分布式锁,其实已满足大部分场景了。

其实每一种实现方案都是有它的优缺点的,我们在知道它的优缺点以后再进行选择。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195869.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • microsoft visual studio最新版本_visual studio 2019下载安装教程

    microsoft visual studio最新版本_visual studio 2019下载安装教程微软已经向MSDN订阅用户提供了VisualStudio2013正式版镜像下载,不过非MSDN用户可以在微软的VisualStudio2013官方网站上下载到正式版镜像(通过下载专业版本,已验证与MSDN版本一致)。下面为大家整理一下个版本下载地址。MicrosoftVisualStudioUltimate2013(简体中文旗舰版)文件名: cn_visual_st

  • IOS本地化应用

    IOS本地化应用

  • mediumtext_【紧急求助】关于mediumtext类型数据的调用

    mediumtext_【紧急求助】关于mediumtext类型数据的调用你的位置:问答吧->PHP基础->问题详情【紧急求助】关于mediumtext类型数据的调用请问各位大大,我如何将mediumtext类型的数据调用输入textarea文本框中呢?主要的问题是mediumtext内没有回车完全可以正常调用,但一旦有回车就无法进行调用,文本框中输入不了任何数据!恳请各位大大不…

  • http错误状态码_HTTP常用的14种状态码

    http错误状态码_HTTP常用的14种状态码一些常见的状态码为:200-服务器成功返回网页404-请求的网页不存在503-服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码说明100(继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。101(切换协议)请求者已要求服务器切换协议,服务器已确认并准备切换。…

  • 如果我说熟悉SpringBoot 面试官会怎么问?

    如果我说熟悉SpringBoot 面试官会怎么问?SpringBoot因简化了Spring框架使用难度,极大地提高了Java企业级应用开发的效率,成为企业考核人才的重要标准之一。但随着现今互联网行业快速发展、企业业务不断深入,相应地对SpringBoot技术要求也愈来愈高。春节时期有一位打算金三银四面试的读者私信问我:如果我说熟悉SpringBoot面试官会怎么问?​可能不少朋友跟他一样,不清楚当下企业真实生产环境下对SpringBoot有哪些具体要求,需要掌握到什么程度。为此,结合这些年的面试经历及各大厂的职位要求,给

  • 100TB大数据存储方案

    100TB大数据存储方案HiveHbase存储介质:https://www.zhihu.com/question/46392643?sort=created请问,在家里攒一套100TB-200TB的存储有什么架构方案可以借鉴的?预算10万以内,性价比越高越好 带宽和吞吐量不是很重要,USB3.0/千兆LAN单出口都可以接受,软raid硬raid都行 可以是机柜形式,有单间机房 耗电无所谓…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号