什么是分布式锁?

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 什么是分布式锁?

什么是分布式锁?

在一些分布事场景下,为了保证数据的一致性,而分布式锁就是用来解决这个问题的。例如,当多台机器需要对同一个用户属性进行修改时,就会出现属性值跟预想的不一样的结果,如下图所示:

e448b4c00473cd995486ae71a8d917d1.png PS:其实跟多线程锁需要解决的问题很像——都是为了达到数据的一致性。只不过多线程锁是为了解决单机问题,而分布式锁是为了解决多台机器(分布式集群)的问题。

分布式锁应该具备的条件:

  • 一个方法同一时间只能被一台机器执行;
  • 高可用的获取锁和释放锁;
  • 高性能的获取锁和释放锁;
  • 具备可重入性;
  • 具备相应的机制,防止死锁;

三种分布式锁的实现

有三种实现分布式的方式,分别是:

  • 基于数据库;
  • 基于缓存(Redis);
  • 基于Zookeeper;

基于数据库

这种方式的核心思想是:在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。

PS:唯一索引是啥?这应该不用解释了。

这种方式的问题:

  • 数据库的可用性和性能直接影响分布式锁,因此数据库需要双机部署、数据同步等;
  • 不具备可重入,因为同一行数据只能存在一个;
  • 没有锁失效的机制;
  • 为了阻塞锁等方式,实现方式比较复杂;

基于缓存(Redis)

Redis实现分布式锁的方式的核心就是:Redis性能较好,而且内置分布式锁命令

具体步骤:

  • 获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断
  • 获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
  • 释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放

这种方式也有缺点:

Redis的性能很好,但是无论是单机还是主从备换模式都可能会造成锁丢失

基于Zookeeper

Zookeeper**是一个专门为分布式应用提供一致性服务的开源组件,**内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名,步骤如下:

  • 创建一个目录mylock
  • 线程A想获取锁就在mylock目录下创建临时顺序节点;
  • 获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁
  • 线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点
  • 线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。

缺点就在于:

需要频繁的创建和删除节点,性能不如Redis

总结

分布式的CAP理论表明——任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。因此没有一种方式可以使得分布式锁完美无缺,具体使用什么方式来实现分布式锁,都应根据不同的应用场景选择最适合的实现方式。

参考链接

什么是分布式锁?

Redis与Zookeeper的分布式锁

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL 算法 Java
分布式锁那点事
分布式锁那点事
39 1
|
2月前
|
存储 NoSQL 关系型数据库
分布式锁实现
分布式锁实现
29 0
初识Redission分布式锁
在微服务系统中,某些场景需要阻塞所有节点的所有线程,对共享资源的访问。比如并发时“超卖”和“余额减为负数”等情况,需要对同一资源进行加锁,这些就需要进行分布式。
初识Redission分布式锁
|
26天前
|
缓存 监控 NoSQL
分布式锁总结
分布式锁总结
25 2
|
2月前
分布式锁 使用注意点
分布式锁 使用注意点
49 2
|
2月前
|
缓存 分布式计算 NoSQL
分布式锁是什么
分布式锁是什么
35 0
|
7月前
|
NoSQL Cloud Native 中间件
什么是分布式锁?他解决了什么样的问题?
什么是分布式锁?他解决了什么样的问题?
|
11月前
|
缓存 NoSQL 安全
浅谈分布式锁
浅谈分布式锁
66 0
|
存储 NoSQL 算法
这样实现分布式锁,才叫优雅!
这样实现分布式锁,才叫优雅!
75 0
|
存储 NoSQL 算法
如何优雅的实现分布式锁
如何优雅的实现分布式锁
80 0