加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

为什么Zookeeper天生就是一副分布式锁的胚子?

发布时间:2020-03-17 07:18:56 所属栏目:编程 来源:站长网
导读:副问题#e# 【金融特辑】光大****科技部DBA女神带你从0到1揭秘MGR 什么是漫衍式锁?漫衍式锁是节制漫衍式体系之间同步会见共享资源的一种方法。在漫衍式体系中,经常必要和谐他们的举措。 图片来自 Pexels 假如差异的体系或是统一个体系的差异主机之间共享了
副问题[/!--empirenews.page--] 【金融特辑】光大****科技部DBA女神带你从0到1揭秘MGR

什么是漫衍式锁?漫衍式锁是节制漫衍式体系之间同步会见共享资源的一种方法。在漫衍式体系中,经常必要和谐他们的举措。

为什么Zookeeper生成就是一副漫衍式锁的胚子?

图片来自 Pexels

假如差异的体系或是统一个体系的差异主机之间共享了一个或一组资源,那么会见这些资源的时辰,每每必要互斥来防备互相滋扰来担保同等性,在这种环境下,便必要行使到漫衍式锁。

为什么要行使漫衍式锁

为了担保一个要领或属性在高并发环境下的统一时刻只能被统一个线程执行。

在传统单体应用单机陈设的环境下,可以行使 Java 并发处理赏罚相干的 API(如 ReentrantLock 或 Synchronized)举办互斥节制;在单机情形中,Java 中提供了许多并发处理赏罚相干的 API。

可是,跟着营业成长的必要,原单体单机陈设的体系被演化身漫衍式集群体系后,因为漫衍式体系多线程、多历程而且漫衍在差异呆板上,这将使原单机陈设环境下的并发节制锁计策失效,纯真的 Java API 并不能提供漫衍式锁的手段。

为了办理这个题目就必要一种跨 JVM 的互斥机制来节制共享资源的会见,这就是漫衍式锁要办理的题目!

举个例子:呆板 A,呆板 B 是一个集群。A,B 两台呆板上的措施都是一样的,具备高可用机能。

A,B 呆板都有一个按时使命,天天晚上破晓 2 点必要执行一个按时使命,可是这个按时使命只能执行一遍,不然的话就会报错。

那 A,B 两台呆板在执行的时辰,就必要抢锁,谁抢到锁,谁执行,谁抢不到,就不消执行了!

锁的处理赏罚

锁的处理赏罚方法如下:

单个应用中行使锁:(单历程多线程)Synchronize。

漫衍式锁节制漫衍式体系之间同步会见资源的一种方法。

漫衍式锁是节制漫衍式体系之间同步会见共享资源的一种方法。

漫衍式锁的实现

漫衍式锁的实现方法如下:

基于数据的乐观锁实现漫衍式锁

基于 Zookeeper 姑且节点的漫衍式锁

基于 Redis 的漫衍式锁

Redis 的漫衍式锁

获取锁

在 set 呼吁中,有许多选项可以用来修改呼吁的举动,以下是 set 呼吁可用选项的根基语法:

redis 127.0.0.1:6379>SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX] 

 

- EX seconds 配置指定的到期时刻(单元为秒) 

- PX milliseconds 配置指定的到期时刻(单元毫秒) 

- NX: 仅在键不存在时配置键 

- XX: 只有在键已存在时配置 

方法 1FЬ查

private static final String LOCK_SUCCESS = "OK"; 

  private static final String SET_IF_NOT_EXIST = "NX"; 

  private static final String SET_WITH_EXPIRE_TIME = "PX"; 

 

ublic static boolean getLock(JedisCluster jedisCluster, String lockKey, String requestId, int expireTime) { 

      // NX: 担保互斥性 

      String result = jedisCluster.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); 

      if (LOCK_SUCCESS.equals(result)) { 

          return true; 

     } 

      return false; 

 } 

方法 2:

public static boolean getLock(String lockKey,String requestId,int expireTime) { 

    Long result = jedis.setnx(lockKey, requestId); 

    if(result == 1) { 

        jedis.expire(lockKey, expireTime); 

        return true; 

    } 

    return false; 

留意FЬ查方法 1,由于方法 2 中 setnx 和 expire 是两个操纵,并不是一个原子操纵,假如 setnx 呈现题目,就是呈现死锁的环境,以是保举方法 1。

开释锁

方法 1:del 呼吁实现

public static void releaseLock(String lockKey,String requestId) { 

   if (requestId.equals(jedis.get(lockKey))) { 

       jedis.del(lockKey); 

  } 

方法 2:Redis+Lua 剧本实现(保举)

public static boolean releaseLock(String lockKey, String requestId) { 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读