关键词:
文章简介
该文章基于超卖为为主线 ,解决在多线程的情况下解决超卖问题的解决方案 ,并且对其各个解决方案方案的优缺点进行分析。
文章内容 介绍
该文章刚开始以超卖问题为主线 先介绍单机本地储存情况下通过JVM本地锁去解决超卖问题,接着深入企业场景 数据在mysql 的情况下如何解决高并发对mysql数据库中进行有序操作防止出现脏读的问题,接着引入 非关系型数据情况下 如何处理集群 服务和线程之间 操作有序性的问题 通过redis 乐观锁和redis hash+lua 脚本 zookeeper 节点性质去处理。
学习成果
可以一定程度上基本的分布式锁的原理和使用有着较为深入的理解 熟练使用redis 和 zookeeper 进行分布式锁的实现 并且对高并发下超卖问题有着深入理解。
文章重点
该文章主要以以下几大方面 解决超卖问题的解决方案 :
1、基于JVM本地机制:基于Lock和synchorinzed 关键字 实现在单机且无数据库情况下解决超卖问题。
2、基于Mysql的锁机制:悲观锁机制、乐观锁机制 利用mysql 基于save delete update insert 等操作的原子性进行解决超卖问题。
3、基于redis 本身的乐观锁机制解决超卖问题 基于exec watch mulitic 等命令行为基础解决超卖的问题。
4、 在多服务情况下redis 分布式解决 超卖 基于 redisson 框架实现分布式情况下超卖 可重入的问题,基于hash+lua 脚本手动实现分布式锁的加锁 解锁和可重入锁 自动续期的问题。
5、基于Zookeeper 原始框架下 实现分布式情况下超卖问题。 通过创造临时节点不可重复原理实现自旋锁, 基于临时可序列化节点+监听机制实现Zookeeper的堵塞锁。
6、基于Mysql实现分布式锁(企业没有用过)通过id 加lockname 进行锁的排他,通过设置ThreadId 和 serverd 进行具体业务记录 通过locationTime进行定时任务的记录。
技术构成
1、环境要求:jdk1.8,Maven3.0+
2、开发工具 idea nginx
3、 测试工具 :jmeter
4、该项目Maven 开发环境
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>distribution-Lock-Learning</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>distribution-Lock-Learning</name>
<description>distribution-Lock-Learning</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.1</version>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.11</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</project>
大数据clickhouse进阶:distributed引擎深入了解(代码片段)
文章目录Distributed引擎深入了解一、简单介绍二、分布式表插入数据三、分片规则四、删除分布式表Distributed引擎深入了解一、简单介绍Distributed引擎和Merge引擎类似,本身不存放数据,功能是在不同的server上把... 查看详情
深入浅出zookeeper(代码片段)
ZooKeeper是一个分布式协调服务 ,由Apache进行维护。ZooKeeper可以视为一个高可用的文件系统。ZooKeeper可以用于发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。一、ZooKeepe... 查看详情
深入了解rabbitmq工作原理及简单使用(代码片段)
深入了解RabbitMQ工作原理及简单使用RabbitMQ系列文章RabbitMQ在Ubuntu上的环境搭建深入了解RabbitMQ工作原理及简单使用RabbitMQ交换器Exchange介绍与实践RabbitMQ事务和Confirm发送方消息确认——深入解读使用Docker部署RabbitMQ集群你不知道的R... 查看详情
大数据clickhouse进阶(二十):materializemysql物化引擎深入了解(代码片段)
文章目录MaterializeMySQL物化引擎深入了解一、MySQL数据库引擎二、MySQL表引擎三、MaterializeMySQL物化引擎1、开启MySQLbinlog2、使用Materialize... 查看详情
深入了解海豚调度dolphinscheduler(代码片段)
深入了解海豚调度DolphinScheduler一、海豚调度介绍二、海豚调度特性三、建议配置四、名词解释五、模块介绍六、功能介绍1.项目首页2.工作流定义3.工作流实例4.任务实例5.任务定义七、任务类型1.SQL2.SPARK节点3.ApacheZeppelin八、集群... 查看详情
云原生|kubernetes篇深入了解ingress(代码片段)
文章目录深入了解Ingress一、Ingressnginx和nginxingress1、nginxingress2、ingressnginx二、ingressnginx安装1、安装2、验证3、卸载深入了解Ingress为什么需要Ingress?Service可以使用NodePort暴露集群外访问端口,但是性能低下不安全缺少Layer7... 查看详情
03-深入了解vue指令(代码片段)
一、指令的深入学习1.1class类切换的对象写法<divid="box"><!--执行结果如下<divclass="aabbcc"></div>--><div:class="classObj"></div></div><script&g 查看详情
03-深入了解vue指令(代码片段)
一、指令的深入学习1.1class类切换的对象写法<divid="box"><!--执行结果如下<divclass="aabbcc"></div>--><div:class="classObj"></div></div><script&g 查看详情
深入解读redis分布式锁(代码片段)
...章:你管这叫线程安全?.NET八股文:线程同步技术解读分布式锁是"线程同步"的延续最近首度应用"分布式锁",现在想想,分布式锁不是孤立的技能点,这其实就是跨主机的线程同步。进程内跨进程跨主机Lock/Monitor、SemaphoreSlimMet... 查看详情
zookeeper架构深入浅出(代码片段)
Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容。像配置管理、任务分发、组服务、分布式消息队列、分布式通知/协调等,这些应用实际上都是基于这项基础服... 查看详情
深入了解abp(代码片段)
一、abp的系统设置(ISettingStore接口)1、如果要新增一个系统设置,必须在使用前定义设置2、系统设置参数有三种级别:应用程序、租户、用户3、在应用层可以使用ISettingManager接口的GetSettingValue方法来回去设置参数的值4、在js... 查看详情
一数据库开发与实战专栏导学及数据库基础概念入门(代码片段)
...数据库访问接口简介2.7数据库的种类2.8作为初学者必须要了解的几种常用数据库三、数据库入门小测验3.1选择题3.2选择题3.3选择题一、专栏导学1. 查看详情
git之深入解析如何在应用中嵌入git(代码片段)
...Git的基础使用流程、分支的管理、托管服务器的技术以及分布式工作流程等相关的技术和能力,请参考:Git之深入解析Git的安装流程与初次运行Git前的环境 查看详情
大数据clickhouse进阶:clickhouse的索引深入了解(代码片段)
文章目录ClickHouse的索引深入了解一、一级索引二、二级索引(跳数索引) ClickHouse的索引深入了解一、一级索引在MergeTree中PRIMARYKEY主键并不用于去重,而是用于索引,加快查询速度,MergeTree会根据index_granularity间... 查看详情
深入了解rabbitmq(代码片段)
AMQP相关概念介绍AMQP是一个提供统一消息服务的应用层标准高级消息队列协议, 是应用层协议的一个开放标准,为面向消息的中间件设计.AMQP是一个二进制协议,具有多信道,协商式,异步,安全,多平台,高效等优点.RabbitMQ是AMQP协议... 查看详情
深入了解组件---自定义事件(代码片段)
gitHub地址:https://github.com/huangpna/vue_learn里面的lesson09一事件名举例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>index1</title></head><body&g 查看详情
rabbitmq实战:理解消息通信(代码片段)
本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。前段时间总结完了「深入浅出MyBatis」系列,对MyBatis有了更全面和深入的了解,在掘金社区也收到了一些博友的喜欢,很高兴。另外,短暂的陪产假就要结束... 查看详情
从构建分布式秒杀系统聊聊分布式锁(代码片段)
...感悟。路漫漫,借此,把前段时间搞着玩的秒杀案例中的分布式锁深入了解一下。案例介绍在尝试了解分布式锁之前,大家可以想象一下,什么场景下会使用分布式锁?单机应用架构中,秒杀案例使用ReentrantLcok或者synchronized来... 查看详情