(笔记)分布式锁


前言

最近在论坛发现有小伙伴经常被问到,什么是分布式锁,常用的分布式锁有哪些,是怎么实现的,本篇文章谈谈我对分布式锁的理解。


提示:以下是本篇文章正文内容,个人看法仅供参考

一、锁是什么?

最早在单机环境下,为了使项目性能提高,前辈们采用升级扩充硬件方式,当硬件升级已经满足不了性能的需求时,又出现了多线程,多线程的出现意味着很多个线程将会同时访问同一个资源,这是极其危险的情况,好比你在银行存了500元,可是我用两部手机同时将500元分别转给A和B两个人,银行必然亏损。银行当然不会让这种情况发生,于是就有了一个办法,在我给A转账的时候,给500上了一把锁,并且只有我有钥匙,在我执行完操作之后,锁再打开 别人才可以进来,这样就皆大欢喜了。

二、分布式锁与普通锁

1.普通锁

普通锁是为了解决统一进程下不同线程操作同一资源的问题
常用的有:主要有两种synchronized和lock(在此处不详细解释)

2.分布式锁

而分布式锁是为了解决不同进程同时操作同一资源的问题

如下图
请添加图片描述

(1)Redisson 分布式锁

Redisson 中的分布式锁自带自动续期机制,其提供了一个专门用来监控和续期锁的 Watch Dog( 看门狗),如果在约定时间内某一进程还未执行完,那么Watch Dog 会不断地延长锁的过期时间,保证锁不会因为超时而被释放。
官网地址:https://redis.io/topics/distlock
使用起来非常方便,已经封装好了 我们只需要几步便可以直接使用首先引入依赖

<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
  <version>3.16.8</version>
</dependency>

配置一下config

@Configuration
public class RedissonConfig {
    
    

    @Bean
    public RedissonClient redissonClient() {
    
    
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        return Redisson.create(config);
    }
}

启用

@Resource
private RedissonClient redissonClient;
 
RLock rLock = redissonClient.getLock(lockName);
try {
    
    
    boolean isLocked = rLock.tryLock(expireTime, TimeUnit.MILLISECONDS);
    if (isLocked) {
    
    
        // TODO
                }
    } catch (Exception e) {
    
    
            rLock.unlock();
    }

这里就不测试了,小伙伴们有时间可以多开几百个线程模拟一下场景,测试一下。

(2)ZooKeeper 实现分布式锁

Zookeeper 是一款开源的分布式服务协调中间件。他实现分布式锁功能的核心流程是在于创建"临时顺序节点" 以及采用 Watcher 监听机制监听临时节点的增减,从而判断当前的线程能够成功获得锁。

获取锁的流程:
1.首先我们需要一个持久节点/locks,客户端获取锁就是在/locks下创建临时顺序节点。
2.此时客户端1,在locks下创建了一个lock1节点,创建成功后,判断自己所创建的节点是否为最小子节点,如果是最小子节点,获取锁成功,如果不是,获取失败
3.获取失败后,说明有其他客户端已经获取到了锁,此时客户端1将会在自己上一个子节点上添加一个事件监听器,当上一个子节点释放锁后,因为有时间监听器,客户端1会收到通知,这时客户端1就加锁成功。

释放锁的流程:
1:获取到锁的客户端在执行完业务流程之后,将创建的临时节点删除。
2:获取到锁的客户端在出现故障之后,临时顺序节点也会被自动删除,避免了锁无法被释放。
3:上面提到的时间监听器,就是监听子节点删除的,子节点被删除就说明已经被释放。

具体代码实现请看此大佬博客,非常细,其中还解释了公平锁和可重入锁。
大佬博客链接:https://www.cnblogs.com/wyzstudy/p/17155297.html

补充:

我们补充一下公平锁和可重入锁的原理
1.公平锁:什么是公平锁呢?顾名思义就是为了公平,举个例子。一家面包店只有一个窗口出售面包,但是却有几十个想要买面包的饥饿汉,大家都想快点买到面包,最终打起来了,这时,店长想了一个办法 先来的发一个号牌,1号,接着来的是二号,依次排下去,按照号牌的顺序购买,即公平又解决了蜂拥而上的问题。
换到锁上来说是一样的 先来的号比较靠前就先获取到锁,依次排队,等上一个使用完毕释放后,后面的再接着获取。叫做公平锁。
2.可重入锁:我们还是用面包的例子,现在方案变了,变成一个家庭为一个整体了 只要家庭中一个人排上号以后,家里的其他人都可以用这个号码,以上这个故事模型中,取号一次,可以用来多次取水,其原理为可重入锁的模型。在重入锁模型中,一把独占锁,可以被多次锁定,这就叫做可重入锁。


总结

本篇文章分享了我对分布式锁的一些个人理解与常用情况,还有其他分布式锁,本文没有涉及,在以后接触到后会分享出来,如有纰漏请指正。感谢阅读!

猜你喜欢

转载自blog.csdn.net/m0_54201610/article/details/132276989