如何制作并维护一个王者荣耀主题的网页素材?
摘要:如何建立一个网站并维护,王者荣耀网页制作素材,云南旅游攻略6天5晚多少钱,怎样注册电商平台成为卖家分布式锁 1 分布式锁介绍 1.1 什么是分布式 一个大型的系统往往被分为几个子系统来做,一个子系统可以部署在一
如何建立一个网站并维护,王者荣耀网页制作素材,云南旅游攻略6天5晚多少钱,怎样注册电商平台成为卖家分布式锁
1 分布式锁介绍
1.1 什么是分布式
一个大型的系统往往被分为几个子系统来做#xff0c;一个子系统可以部署在一台机器的多个 JVM(java虚拟机) 上#xff0c;也可以部署在多台机器上。但是每一个系统不是独立的#xff0c;不是完全独立的。需要相互通信#xff…分布式锁
1 分布式锁介绍
1.1 什么是分布式
一个大型的系统往往被分为几个子系统来做一个子系统可以部署在一台机器的多个 JVM(java虚拟机) 上也可以部署在多台机器上。但是每一个系统不是独立的不是完全独立的。需要相互通信共同实现业务功能。
一句话来说分布式就是通过计算机网络将后端工作分布到多台主机上多个主机一起协同完成工作。
1.2 什么是锁–作用安全
现实生活中当我们需要保护一样东西的时候就会使用锁。例如门锁车锁等等。很多时候可能许多人会共用这些资源就会有很多个钥匙。但是有些时候我们希望使用的时候是独自不受打扰的那么就会在使用的时候从里面反锁等使用完了再从里面解锁。这样其他人就可以继续使用了。
锁 单进程的系统中存在多线程同时操作一个公共变量此时需要加锁对变量进行同步操作保证多线程的操作线性执行消除并发修改。解决的是单进程中的多线程并发问题。 1.4 什么是分布式锁
任何一个分布式系统都无法同时满足一致性Consistency、可用性Availability和分区容错性Partition tolerance最多只能同时满足两项。CAP
当在分布式模型下数据只有一份或有限制此时需要利用锁的技术控制某一时刻修改数据的进程数。
分布式锁: 在分布式环境下多个程序/线程都需要对某一份(或有限制)的数据进行修改时针对程序进行控制保证同一时间节点下只有一个程序/线程对数据进行操作的技术。 1.5 分布式锁的真实使用场景
场景一 场景二 1.5 分布式锁的执行流程 1.6 分布式锁具备的条件
互斥性同一时刻只能有一个服务(或应用)访问资源特殊情况下有读写锁原子性一致性要求保证加锁和解锁的行为是原子性的安全性锁只能被持有该锁的服务(或应用)释放容错性在持有锁的服务崩溃时锁仍能得到释放避免死锁可重用性同一个客户端获得锁后可递归调用—重入锁和不可重入锁公平性看业务是否需要公平避免饿死–公平锁和非公平锁支持阻塞和非阻塞和 ReentrantLock 一样支持 lock 和 trylock 以及 tryLock(long timeOut)—阻塞锁和非阻塞锁PS:::自选锁高可用获取锁和释放锁 要高可用高性能获取锁和释放锁的性能要好持久性锁按业务需要自动续约/自动延期
2.分布式锁的解决方案
2.1 数据库实现分布式锁
基于数据库实现分布式锁主要是利用数据库的唯一索引来实现唯一索引天然具有排他性这刚好符合我们对锁的要求同一时刻只能允许一个竞争者获取锁。加锁时我们在数据库中插入一条锁记录利用业务id进行防重。当第一个竞争者加锁成功后第二个竞争者再来加锁就会抛出唯一索引冲突如果抛出这个异常我们就判定当前竞争者加锁失败。防重业务id需要我们自己来定义例如我们的锁对象是一个方法则我们的业务防重id就是这个方法的名字如果锁定的对象是一个类则业务防重id就是这个类名。
2.1.1 基于数据库表实现
准备工作创建tb_program表用于记录当前哪个程序正在使用数据
CREATE TABLE tb_program (program_no varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 程序的编号PRIMARY KEY (program_no) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT Compact;实现步骤
程序访问数据时将程序的编号insert存入tb_program表当insert成功代表该程序获得了锁即可执行逻辑当program_no相同的其他程序进行insert是由于主键冲突会导致insert失败则代表获取锁失败获取锁成功的程序在逻辑执行完以后删除该数据,代表释放锁。
2.1.2 基于数据库的排他锁实现
除了可以通过增删操作数据表中的记录以外其实还可以借助数据中自带的锁来实现分布式的锁。我们还用刚刚创建的那张数据库表基于MySql的InnoDB引擎(MYSQL的引擎种类)可以通过数据库的排他锁来实现分布式锁。
实现步骤
在查询语句后面增加for update数据库会在查询过程中给数据库表增加排他锁。
