文章简介

该文章基于超卖为为主线 ,解决在多线程的情况下解决超卖问题的解决方案 ,并且对其各个解决方案方案的优缺点进行分析。

文章内容 介绍

该文章刚开始以超卖问题为主线 先介绍单机本地储存情况下通过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>