分布式锁的简要设计与实现

  1. 说明

在微服务的项目中,我们经常会遇到多个服务对统一资源的并发访问,比如文件资源、数据库资源、以及缓存资源等。如果我们不对这些资源做访问同步控制,那么将会对我们的数据的唯一性造成影响。要做资源的同步不仅仅只是线程同步这么简单,该同步是对服务级别的同步。

  1. 同步设计
  •    基础同步

第一种方式,系统考虑最基础的同步,采用redis作为中间件,没有等待唤醒机制,同步服务采用轮询的方式去获取分布式锁。所有服务访问需要同步的资源的时候,首先去获取锁,如果获取到锁那么就加锁,然后访问资源,访问完成之后再释放锁。如果没有获取到锁,那么就线程自动睡眠1秒钟,然后继续轮询获取锁。这样是最简单的办法,但是这样对系统的性能可能会造成影响。

如下流程图方式:

      

  • 等待唤醒机制

第二种方式,系统考虑的是等待与唤醒机制,当服务需要访问临界资源的时候,首先去获取分布式锁,如果分布式锁被占用,那么他将服务阻塞,如果锁被释放掉,那么将唤醒该锁上所有等待的服务。这样做的好处是可以提高系统性能。

如下流程图所示:

   

  1. 应用架构

框架采用的springboot

  1. 使用方式

此分布式锁是在springboot的2.0.6release版本上面进行开发的。

  • 引入包

在maven中引入dlock的包:

<dependency>
    <groupId>
com.moon</groupId>
    <artifactId>
dlock</artifactId>
    <version>
1.0-SNAPSHOT</version>
</dependency>

引入该包之后,可能还需要引入该包锁依赖的包。

  • 配置

需要在application.yml文件中加入如下配置:

  1. 代码使用

    

  • 注解方式

在需要分布式同步的方法上面加上ServerSync注解即可同步。ServerSync的方式有两个,第一个是锁的同步模式,分为block(阻塞)、polling(轮询)。阻塞表示加了锁之后,当前服务自动阻塞,等待其他服务用完锁之后进行唤醒;轮询的方式表示该锁不阻塞,会一直轮询获取锁,直到超时。

  • 轮询锁:

    如图所示,轮询锁:

    

    效果如下:

    

  •      阻塞锁

   如下图所示,阻塞锁的使用:

调用效果如下:

  • 同步代码块

效果如下:

源代码地址:https://github.com/lengkristy/dlock.git

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落寞书生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值