C#利用线程锁实现分布式锁

在网上找很多分布式锁的相关资料,都要部署一些服务支持,经过简单的实践,其实可以使用线程锁实践简单的分布式锁的功能。其效果如下:

using(DistributLock.Lock(lockKey))

{

        //锁执行的代码

}

当执行完成锁的代码,就根据锁的发起顺序执行下一个锁的代码。

要满足以上需求,要有三部分的组成

锁本身,自行开发,这里实际就是一个创建一个分布式锁的编号,这里使用guid来作为锁的唯一ID。

锁的调度服务,自行开发,每次发起一个分布式锁,都向该服务注册,注册过程必须是单线程,以锁的lockKey创建一个Queue,作为锁进入的顺序,每解锁一次,则移除一个队列元素,这个元素就是锁的ID,并且获取下一个锁的ID,向外发送解锁通知

解锁通知服务,这里为了简单,使用了RabbitMQ作为中间消息通讯中间件,当然也可以自己开发,感觉没必要,在微服务中,这个中间件也是比较常用的,部署一下也不花多少时间。

其流程如下

创建一个锁,并根据锁的lockKey请求执行,若调度服务返回锁的数量大于0,则创建一个线程锁等待,并且创建一个MQ订阅,在接收到MQ消息的时候,执行线程锁的解;否则没有锁,往下执行。当接收到解锁指令就接触线程锁继续执行。

注意的是,每次MQ的Exchang就是线程锁的ID,调度服务也是向这个ID的Exchange发布解锁消息。

若有需要代码,可以与我联系。后续也会在Java上实现该功能。目前系统的微服务分了.net和java,开发起来花的精力比较多,头痛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值