分布式锁

作者: zhglance | 来源:发表于2019-04-22 16:57 被阅读76次

1.分布式CAP原则

在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。因此不同的系统要根据CAP理论做出取舍,绝大多数场景是牺牲一致性来换取系统的高可用性,系统保证最终一致性。

2.分布式锁

在分布式模型下,通过锁机制来让多个客户端互斥的对共享资源进行访问,要求具有排他性,避免死锁性和高可用性。

3.分布式锁的实现

3.1 基于数据库实现

a.基于乐观锁
乐观锁说明:
CAS(V,E,N);
V表示要更新的变量,E表示预期值,N表示新值。
如果V值等于E,则说明还没有其他线程修改V的值,则将V的值设置为N,若V的值和E不等,则说明该值已经被其他线程更新了,则当前线程可以选择重试或者放弃操作。

在DB中表中添加version字段来实现,select数据时也读取version,当更新数据的时候,判断version与DB中的是否相同,如果是,则正常更新且version+1;否则更新失败。

a.基于悲观锁
使用select * from table-1 where id = '10000' for update,id是主键。当这条记录添加上悲观锁后,其他线程无法操作该记录,执行完成后,释放锁即可。

3.1 基于Redis实现

依赖于Redis的原子操作。
加锁:

String result = redis.set(locked_key, request_random_Id, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expire_time);
if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
 return false;

释放锁:

 String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(request_random_Id));

        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;

释放锁的时候需要判断request_random_Id是否等于自己的,如果相等则删除
参考:https://www.cnblogs.com/linjiqin/p/8003838.html

3.1 基于Zookeeper实现

使用Zookeeper的临时节点来实现分布式锁。
原理就是:当一个clietn想要加锁时,就在zookeeper上的指定/lock节点的目录下,去生成一个唯一的临时有序节点, 然后判断自己是否是这些有序节点中序号最小的一个,如果是,则意味着获取了锁。如果不是,则说明没有获取到锁,那么就需要在序列中找到比自己小的那个节点,并对其调用 watch()方法,对其注册事件监听,当监听到这个节点被删除了, 再次争取锁,如果获取了锁,则执行自己的程序,然后删除临时节点,即删除锁;否则重复以上步奏,判断自己是否是最小节点。

相关文章

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资...

  • 4:Redis 分布式锁 (文末有项目连接)

    1:什么是缓存分布式锁 2:分布式锁的关键代码 3:业务代码使用分布式缓存锁 4:业务代码使用分布式缓存锁 5:测...

  • 锁(2)-- 分布式锁

    前言: 锁分3种:java锁、分布式锁、DB锁 分布式锁的几种实现方式 目前几乎很多大型网站及应用都是分布式部署...

  • java锁的概念

    参考文档探究分布式并发锁并发编程-锁的发展和主流分布式锁比较总结从构建分布式秒杀系统聊聊分布式锁探索并发编程(六)...

  • Redis实现分布式锁

    分布式下的分布式锁一般实现有三种: 基于数据库的乐观锁 基于redis的分布式锁 基于zookeeper的分布式锁...

  • 分布式锁

    为什么要用分布式锁? 分布式锁是悲观锁的实现; 如果采用乐观锁的方案就用不着分布式锁了。 能用乐观锁的地方尽量用乐...

  • 3.10:分布式锁

    本文将梳理微服务架构下,分布式锁的常用方案。整体包含以下三部分: 分布式锁的提出 分布式锁主流方案 分布式锁选择 ...

  • Redis实现分布式锁

    1. 分布式锁分类 数据库乐观锁 基于Redis的分布式锁 基于ZooKeeper的分布式锁 2. 组件依赖 po...

  • 大佬浅谈分布式锁

    redis 实现 redis 分布锁一、redis 实现分布式锁(可重入锁)redission 实现分布式锁1、对...

网友评论

    本文标题:分布式锁

    本文链接:https://www.haomeiwen.com/subject/gikugqtx.html