分布式锁的应用场景和三种实现方式的区别_负载均衡策略

分布式锁的应用场景和三种实现方式的区别_负载均衡策略多线程对同一资源的竞争,需要用到锁,例如Java自带的Synchronized、ReentrantLock。但只能用于单机系统中,如果涉及到分布式环境(多机器)的资源竞争,则需要分布式锁。分布式锁的主要作用:保证数据的正确性:比如:秒杀的时候防止商品超卖,表单重复提交,接口幂等性。避免重复处理数据:比如:调度任务在多台机器重复执行,缓存过期所有请求都去加载数据库。分布式锁的主要特性:互斥:同一时刻只能有一个线程获得锁。可重入:当一个线程获取锁后,还可以再次获取这个锁,避免死锁发生。高可用:当

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

应用场景

多线程对同一资源的竞争,需要用到锁,例如Java自带的Synchronized、ReentrantLock。
但只能用于单机系统中,如果涉及到分布式环境(多机器)的资源竞争,则需要分布式锁。

分布式锁的主要作用:

  1. 保证数据的正确性:
    比如:秒杀的时候防止商品超卖,表单重复提交,接口幂等性。
  2. 避免重复处理数据:
    比如:调度任务在多台机器重复执行,缓存过期所有请求都去加载数据库。

分布式锁的主要特性:

  1. 互斥:同一时刻只能有一个线程获得锁。
  2. 可重入:当一个线程获取锁后,还可以再次获取这个锁,避免死锁发生。
  3. 高可用:当小部分节点挂掉后,仍然能够对外提供服务。
  4. 高性能:要做到高并发、低延迟。
  5. 支持阻塞和非阻塞:Synchronized是阻塞的,ReentrantLock.tryLock()就是非阻塞的
  6. 支持公平锁和非公平锁:Synchronized是非公平锁,ReentrantLock(boolean fair)可以创建公平锁

分布式锁的知识图谱

在这里插入图片描述

分布式锁的实现方式

使用 MySQL 实现分布式锁

数据库表设计:

CREATE TABLE `distributed_lock` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `resource_name` varchar(200) NOT NULL DEFAULT '' COMMENT '资源名称(唯一索引)',
  `owner` varchar(200) NOT NULL DEFAULT '' COMMENT '锁持有者(机器码+线程名称)',
  `lock_count` int NOT NULL DEFAULT '0' COMMENT '加锁次数',
  `expire_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '锁过期时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_resource_name` (`resource_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分布式锁';
  1. 锁的实现原理:
    将用来竞争的资源名称设置为表的唯一索引。
    获取锁的时候,就插入一条记录。插入成功就代表获取到锁,插入失败就代表获取锁失败。
    释放锁的时候,就删除这条记录。
  2. 支持阻塞和非阻塞:
    可以用while循环直到插入成功,不过自旋也会占用CPU。
  3. 支持可重入:
    使用锁持有者owner和加锁次数字段lock_count实现可重入:
    获取锁,次数加一,释放锁,次数减一,次数为零就删除这把锁。
  4. 支持过期时间
    使用过期时间expire_time字段,通过异步任务检测避免因程序异常或机器宕机导致锁无法释放。
  5. 支持锁续期
    获取锁的同时,启动一个异步任务,每当业务执行到三分之一时间,也就是6秒中的第2秒的时候,就自动延长锁过期时间,继续延长到6秒,这样就能保证业务逻辑处理完成之前锁不会过期。

使用 Redis 实现分布式锁

由于MySQL并发性能跟不上,所以还可以使用Redis实现分布式锁。
获取锁,并设置过期时间:

// 1. 获取锁
redis.setnx('resource_name1', 'owner1')
// 2. 增加锁过期时间
redis.exprire('resource_name1', 6, TimeUnit.SECONDS)

但是setnxexprire两条命令不是原子的,可能获取锁之后还没来得及设置过期时间就宕机了。
所以可以使用Redis 2.6.12之后提供的一条复合命令:

redis.set('resource_name1', 'owner1',"NX" "EX", 6)

释放锁:

// 释放锁
if ('owner1'.equals(redis.get('resource_name1'))){ 
   
  redis.del('resource_name1')
}

释放锁时判断锁的持有者,可以避免把其他线程持有的锁给释放掉了。
但是getdel两条命令不是原子操作,需要引入Lua脚本把两条命令打包成一条发给Redis执行:

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

此外,实现锁续期的功能,可以使用Redis客户端的Redisson的WatchDog功能,在我们调用lock自动唤醒WatchDog

使用 Zookeeper 实现分布式锁

zookeeper采用树形节点,类似Linux目录文件结构,同一目录下的节点名称不能重复。
在这里插入图片描述
节点有分为四种类型:

**持久节点:**一旦创建,永久存储在服务器上,除非手动删除。
临时节点:生命周期与客户端绑定,客户端断开连接,节点就被自动删除。
**持久顺序节点:**特性同持久节点,只是在节点名称后面追加自增有序数字。
**临时顺序节点:**特性同临时节点,只是在节点名称后面追加自增有序数字。

zookeeper还有个监听-通知机制,客户端可以在资源节点上创建watch事件。当节点发生变化,会通知客户端,客户端可以根据变化做相应的业务处理。

我们可以利用临时顺序节点的特性创建分布式锁,分以下三步:

  1. 在资源/resource1目录下创建临时顺序节点node
  2. 获取/resource1目录下的所有节点,如果当前节点序号最小,代表加锁成功
  3. 如果不是,就是watch监听序号最小的节点

实现逻辑很简单,我们来分析一下zookeeper实现分布式锁的优点:

  1. 由于创建的临时节点,断开连接后自动删除,所以无需设置锁超时时间,也就不用考虑不释放和锁续期
  2. 由于节点上存储的创建人信息,锁也就支持可重入
  3. 由于可以监听节点,也就实现了可阻塞
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196014.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 服务器支持p2v,菜鸟必知 实施P2V迁移成功的五大秘诀

    服务器支持p2v,菜鸟必知 实施P2V迁移成功的五大秘诀虚拟服务器迁移工具对操作系统、应用和设置进行镜像复制,并转换成虚拟硬盘文件(适用于MicrosoftHyper-V和CitrixXenServer来说)或者虚拟机磁盘格式文件(适用于VMware)。然后P2V转换工具自动诸如虚拟硬件驱动,并启动虚拟机运转起来。多数P2V迁移直截了当,但也会偶尔发生问题。下面,GregShields将分享五条让P2V迁移成功的技巧。一、注意已安装的OEM系统当…

    2022年7月26日
    7
  • android开机动画包制作工具实现「建议收藏」

    android开机动画包制作工具实现「建议收藏」android开机动画包制作  由于项目的需要,要制作LOGO有光亮的闪烁,网上查了资料,都是介绍 desc.txt文件的格式,但对于每一帧的图片制作没有现成的工具,所以本人试着自己先一个,只要满足自己的需求(logo光来回扫动)就行,其他复杂的情况不考虑。  首先是 desc.txt的实现:  102460016  p00part0  很简单,分辨率,播

    2022年5月14日
    44
  • 什么是人工智能,大数据,云计算,物联网系统_5g物联网人工智能大数据

    什么是人工智能,大数据,云计算,物联网系统_5g物联网人工智能大数据人工智能,英文缩写为AI。是利用计算机科学技术研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法通过人脑甚至主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。 互联网科技发展蓬勃兴起,人工智能时代来临,抓住下一个风口。为帮助那些往想互联网方向转…

    2022年10月6日
    0
  • IDEA导入maven项目详细介绍「建议收藏」

    IDEA导入maven项目详细介绍「建议收藏」一、项目结构注意,.classpath是eclipse特有文件,如果项目会使用eclipse打开,请不要删除。二、导入项目1、打开Idea编辑器2、导入项目点击ImportProject按钮,界面如下注意,我们是导入maven项目,因此项目根目录下一定存在相对应的maven配置Pom.xml文件,点击OK,继续下一步。3、选择导入的项目类型…

    2022年6月16日
    163
  • 使用 UpdatePanel

    使用 UpdatePanel1概述ASP.NETUpdatePanel控件能让你创建丰富的、以客户为中心的Web应用程序。使用UpdatePanel控件,可以刷新选择的页面部分而不是使用回发来刷新整个页面,这就像是执行了一个局部页面更新一样。包含一个ScriptManager和一个或多个UpdatePanel的Web页面会自动加入局部页面更新,而不需要定制客户端代码。1.1场景…

    2022年7月23日
    10
  • 2022电力电缆复训题库及在线模拟考试

    2022电力电缆复训题库及在线模拟考试题库来源:安全生产模拟考试一点通公众号小程序2022年电力电缆操作证考试题为电力电缆复习题考前押题!2022电力电缆复训题库及在线模拟考试根据电力电缆考试教材。电力电缆考试题库通过安全生产模拟考试一点通准确把握考试要点。1、【单选题】6~35kV三芯交联聚乙烯电缆共用()。(A)A、内护套B、中性导体C、地线2、【单选题】中性点经电阻接地的优点是,()。(A)A、减小了单相接地电流B、不需要增加设备C、加大了电磁干扰3、【单选题】传统的配电网,特别是农村电网多为()。(

    2022年5月7日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号