目录

分布式锁定义

目的

基于redis分布式锁

基于zookeeper实现的分布式锁

edis、zookeeper、etcd实现分布式锁的比较

建议选择etcd实现分布式锁


分布式锁定义

分布式环境下,锁定全局唯一资源。

请求处理串行化、实际表现为互斥锁。

目的

交易订单锁定:防止重复下单、解决业务层幂等问题。

MQ消息消费幂等性:发送消息重复、消息消费端去重、比如手机提现。

在用户对商品下单后,订单状态为待支付,在某一时刻用户正在对该订单做支付操作,商家对该订单进行改价操作:状态的修改行为需要做串行化处理,避免出现数据错乱。

基于redis分布式锁

redis单进程、单线程,唯一线程串行化处理。

实现方式:

redis setnx命令在指定的key不存在时,为key设置指定的值。

setnx keyname value expire time :设置成功,返回1,设置失败,返回0。

存在问题:

锁时间不可控,无法续租期。

单点问题:单实例存在进程一旦死掉,会彻底阻塞业务流程;主从方式,主从数据异步,会存在锁失效问题。(极端情况下,高可用无法保证,所以在交易场景这种锁是不ok的,但是在一些社交场景也ok)

官方建议:

redis本身建议使用rediock(相当于RAFT)算法来保证,但是问题是需要至少三个redis主从实例来完成,维护成本相对较高。rediock等同于自己实现简单的一致性协议,细节繁琐,且容易出错。

基于zookeeper实现的分布式锁

zookeeper对锁实现使用创建临时节点和watch机制,执行效率、扩展能力、社区活跃度等方面低于etcd。

edis、zookeeper、etcd实现分布式锁的比较

建议选择etcd实现分布式锁

分布式锁存储选型(etcd):

简单KV、强一致、高可用(无单点)、数据高可靠(持久化)

获取锁平均耗时:

获取锁的平均耗时大概是在2.1ms左右。

由于etcd的强一致性,根据raft算法,消耗时间稍微长一点。

etcd兼容性测试:

etcd提供了独有的集群管理模式,方便进行极端case下的测试,以三个节点的etcd集群为例:

1.单节点停机,不影响持续写入,不影响读,结果有一致性。

2.当只有一个节点时,读会停机,写入正常。

3.理论上只要不是多节点同时停机,线上服务不会受影响。

etcd恢复/版本:

etcd有自有的数据恢复方式,如果服务停机后,可以将所有数据转移重启。

etcd的增删节点,节点迁移等部署相关,均有相关操作方式。

etcd版本选择,选择用etcd3.2.9,因为V3 API暂时还不够完备,建议用V2方式实现:

V3提供gRPC接口,天然提供分布式锁功能:只需申请锁、释放锁,不用关注锁的租期问题。

什么是分布式锁?redis、zookeeper、etcd实现分布式锁有什么不同之处?相关推荐

  1. Redis实现分布式锁全局锁—Redis客户端Redisson中分布式锁RLock实现

    2019独角兽企业重金招聘Python工程师标准>>> 1. 前因 以前实现过一个Redis实现的全局锁, 虽然能用, 但是感觉很不完善, 不可重入, 参数太多等等. 最近看到了一个 ...

  2. etcd 笔记(08)— 基于 etcd 实现分布式锁

    1. 为什么需要分布式锁? 在分布式环境下,数据一致性问题一直是个难点.分布式与单机环境最大的不同在于它不是多线程而是多进程.由于多线程可以共享堆内存,因此可以简单地采取内存作为标记存储位置.而多进程 ...

  3. 技术分享| 基于 Etcd 的分布式锁实现原理及方案

    1. 为什么选择 Etcd 据官网介绍,Etcd 是一个分布式,可靠的 Key-Value 存储系统,主要用于存储分布式系统中的关键数据.初见之下,Etcd 与 NoSQL 数据库系统有几分相似,但作 ...

  4. 第五阶段-第五阶段高性能分布式缓存Redis

    第五阶段 大型分布式系统缓存架构进阶 文章目录 第五阶段 大型分布式系统缓存架构进阶 第一部分 Redis 快速实战 第一节 缓存原理与设计 1.1 缓存基本思想 1.11 缓存的使用场景 1.12 ...

  5. mysql 查看锁_别吵吵,分布式锁也是锁

    Tomcat是这个系统的核心组成部分, 每当有用户请求过来,Tomcat就会从线程池里找个线程来处理,有的执行登录,有的查看购物车,有的下订单,看着属下们尽心尽职地工作,完成人类的请求,Tomcat就 ...

  6. 分布式键值存储系统ETCD调研

    分布式键值存储系统ETCD调研 分布式键值存储系统ETCD调研 简介 etcd是一个开源的分布式键值存储工具--为CoreOS集群提供配置服务.发现服务和协同调度.Etcd运行在集群的每个coreos ...

  7. Java开发高级工程师面试,etcd:一款比Redis更骚的分布式锁的实现方式

    Watch 机制支持 Watch 某个固定的 key,也支持 Watch 一个范围(前缀机制). 当被 Watch 的 key 或范围发生变化,客户端将收到通知:在实现分布式锁时,如果抢锁失败, 可通 ...

  8. 分布式锁原理——redis分布式锁,zookeeper分布式锁

    首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法.变量. 在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在j ...

  9. 关于分布式锁原理的一些学习与思考:redis分布式锁,zookeeper分布式锁

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 作者:队长给我球. 出处:https://w ...

最新文章

  1. 蓝桥杯国赛-矩阵计数三种解法-java实现
  2. 女程序员婚前买房给父母住,婚后要求男程序员一起还房贷!男程序员怀疑婚姻!...
  3. 100行的python作品详解_不到 100 行 Python 代码徐峥变葛优
  4. Nginx打开目录浏览功能(autoindex)以及常见问题解决方案
  5. P4111 [HEOI2015]小Z的房间
  6. java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园
  7. Button 的 clilck 事件
  8. 2022年3月26日 张量-外积
  9. linux怎么安装uwf命令,linux实题小练
  10. Unity3D延迟执行功能脚本
  11. Python功能使用学习笔记(4)--链接数据库
  12. Android / iOS 招聘
  13. 影视短视频剪辑的完整操作流程(普通人也能学会)
  14. SuperMap iDesktop Cross 8C(2017)产品介绍
  15. DAU与GMV的差异,蛋鸡与肉鸡的区别
  16. PIC单片机-PWM波
  17. VUE计算属性如何带参数
  18. Cocos2D中的Framerate状态
  19. 何先振第1期:Java编程入门计算机介绍
  20. python中的max_row_基于row max定位条件列值

热门文章

  1. springmvc的配置
  2. Hashtable TreeMap HashMap LinkedHashMap的区别
  3. 怎么查看电脑内存和配置_电脑内存条如何选择?老司机带你如何选择电脑内存条...
  4. 数字货币交易所源码_(数字货币交易所科普)开发数字货币交易所应该注意哪些问题...
  5. 引入antd组件样式_如何使用 dumi 和 fatherbuild 创建组件库
  6. vue el-checkbox循环多个如何选中当前的_一次关于Vue的自我模拟面试
  7. css3宽度变大动画_学所 前端 | HTML5+CSS3
  8. threejs模型可视化编辑器_一个近乎无门槛、零基础的3D场景编辑器
  9. C语言函数sscanf()的用法
  10. hosts和resolv.conf区别