0401锁详解-MySQL-数据库

news2024/9/27 7:23:04

1 概述

  • 介绍
    锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库显得尤其重要,也更加复杂。

  • 分类:MySQL中的锁,按照锁的粒度分,分为以下三类

    • 全局锁:锁定数据库中的所有表;
    • 表锁:锁住整张表;
    • 行级锁:每次操作锁住对应的行数据。

2 全局锁

  • 介绍

全局锁就是对整个数据库实例加锁,加锁后整个数据库实例处于只读状态,后续DML语句、DDL语句以及更新操作的事务提交语句都将被阻塞。

其典型应用场景就是做全库的逻辑备份,多所有表锁定,从而获得一致性视图,保证数据的完整性。

  • 演示

在这里插入图片描述

-- 加全局锁
flush tables with read lock;
-- 备份
mysqldump -u用户名 -p密码 数据库名 > 备份地址;
-- 解锁
unlock tables;

备份示例,窗口1 :

-- 链接数据库
mysql -h 127.0.0.1 -uroot -p
-- 加全局锁
flush tables with read lock;

窗口2 ,备份数据库

mysqldump -h 127.0.0.1 -uroot -proot1234 nacos> /Users/gaogzhen/Downloads/nacos1.sql
  • mysqldump是mysql提供的备份工具,不是sql命令

窗口3 ,链接数据库执行插入操作

use nacos;
insert into nacos values('gaogzhen', '123456', 1);
  • 未释放全局锁之前,该操作一直阻塞

如下图所示:

在这里插入图片描述

窗口1执行释放全局锁命令:

unlock tables;

释放锁之后,如下图所示:

在这里插入图片描述

  • 特点:数据库中加全局锁,是一个比较重的操作,存在以下问题:
    • 如果在主库上备份,那么在备份期间不能执行更新,业务停摆;
    • 如果在从库上备份,那么备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

在InnoDb引擎中,我们可以在备份时加上参数--single-transaction来完成不加锁的一致性备份数据。

命令如下:

-- 不加锁备份
mysqldump -h host --single-transaction -u用户名 -p密码 数据库名 > 备份地址;

3 表锁

表级锁,每次操作锁住整张表。锁粒度大,发生锁冲突概率高,并发度低。应用在MyISAM、InnoDB、BDB等存储引擎中,我们主要讲解InnoDB中的表级锁。

表级锁分类:

  • 表锁
  • 元数据锁(meta data lock,MDL)
  • 意向锁

3.1 表锁

表锁分类:

  • 表共享读锁(read lock)
  • 表独占写锁(write lock)

加锁、解锁语法:

-- 加锁
lock tables 表名 read/write;
-- 解锁
unlock tables / 客户端断开连接。
  • 读锁特点:客户端A加read lock,客户端A只能执行读操作,不能执行写操作;其他连接能执行读操作,写操作会被阻塞,直至库客户端A释放锁。如下图所示

    在这里插入图片描述

示例如下:

步骤1:开启2个客户端,目标表score。

步骤2:客户端A对表A加读锁

 -- 表score加读锁
 lock tables score read;

步骤3:客户端A执行读取操作

select * from score;
| id | name | math | english | chinese |
+----+------+------+---------+---------+
|  1 | Tom  |   67 |      88 |      95 |
|  2 | Rose |   23 |      66 |      90 |
|  3 | Jimi |   98 |      77 |      80 |

步骤4:客户端A执行写操作

update score set english=100 where id=1;
ERROR 1099 (HY000): Table 'score' was locked with a READ lock and can't be updated

步骤5:客户端B执行读取操作

select * from score;

步骤6:客户端B执行写操作

update score set 
  • 阻塞

  • 表write特点:客户端A加写锁,客户端可以执行读写操作;其他客户端读写操作会被阻塞,直至客户端释放锁.

    在这里插入图片描述

示例:

-- 客户端加写锁
lock tables score write;
select * from score;
update score set math=60 where id=1;
-- 客户端B查询
select * from score;
-- 客户端A释放锁
unlock tables;

阻塞如下图所示:

在这里插入图片描述

释放锁如下图所示:

在这里插入图片描述

3.2 元数据锁

MDL加锁过程是系统自动控制,无需显示使用,在访问一张表的时候自动加上。MDL锁的主要作用是维护表元数据的数据一致性。在表上有活动事务时,不能对元数据执行写操作。为了避免DML与DDL冲突,保证读写的正确性。

元数据是描述数据库结构和对象的信息,如表结构、索引、触发器等。

在MySQL5.5加入了MDL, 当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排它锁)。如下表所示:

SQL类型锁类型说明
lock tables xxx read/writeSHARED_READ_ONLY/SHARED_NO_READ_WRITE
select\select … lock in share modeSHARED_READ与SAHRED_READ,SHARED_WRITE兼容,与EXCLUSIVE互斥
Insert、update、delete、select … for updateSHARED_WRITE元数据是描述数据库结构和对象的信息,如表结构、索引、触发器等。
alter table …EXCLUSIVE与其他MDL互斥

示例:

-- 窗口1开启事务,执行查询
select * from score;
-- 窗口2 开启事务,执行修改表结构
alter table add column java int;

如下图所示:3.2-1所示:

在这里插入图片描述

修改表结构语句,加exclusive排它MDL锁,阻塞;当窗口1提交事务后,继续执行。

  • 查看元数据锁

    select object_type,object_schema,object_name,lock_type,lock_duration from information_schema.metadata_locks;
    

示例:

-窗口1 开启事务
begin;
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
≈
object_typeobject_schemaobject_namelock_typelock_duration
TABLEperformance_schemametadata_locksSHARED_READTRANSACTION
-- 窗口1执行查询
select * from score;
-- 窗口2 开启事务
begin;
update score set math=28 where id=1;
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

如下表所示:

object_typeobject_schemaobject_namelock_typelock_duration
TABLEperformance_schemametadata_locksSHARED_READTRANSACTION
TABLEperformance_schemametadata_locksSHARED_READTRANSACTION
TABLEgaogzhenscoreSHARED_READTRANSACTION
TABLEgaogzhenscoreSHARED_WRITETRANSACTION
-- 现在窗口2 执行删除java列操作
alter table score drop column java;
-- 窗口1 查看元数据锁
  • 窗口2 阻塞,如下图所示

在这里插入图片描述

窗口1,提交事务,窗口2正常执行。

3.3 意向锁

  • 概述

InnoDB意向锁是为了支持多粒度锁共存而设计的,意向锁是一种特殊的行锁。在取得行锁之前需要先获取表的意向锁。
意向锁分为两类:意向共享锁和意向排他锁:

  • 意向共享锁IS:表示事务想要对表中的行设置共享锁,有语句select ... in share mode添加;
  • 意向排他锁IX:表示事务想要对表中行设置排他锁,由insert\update\delete ... 添加。

意向锁主要是辅助表级和行级锁冲突的判断,因为InnoDB支持行级锁,如果没有意向锁,那么判断表级锁和行级锁冲突就需要遍历所有行的行锁,有了意向锁就可以直接判断意向锁是否存在就可以判断是否有行锁了。

  • 与表锁兼容性

    • 意向共享锁(IS): 与表锁共享锁(read)兼容,与表锁排它锁(write)互斥;
    • 意向排它锁(IX):与表锁共享锁(read)及表示排它锁(write)都互斥;
    • 意向锁之间不互斥。
  • 查看意向锁与行锁加锁

    select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
    
  • 意向锁测试

第一步:窗口1 开启事务,添加意向共享锁IS

begin;
select * from score where id=1 lock in share mode;

第二步:窗口2查看锁记录

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenscoreNULLTABLEISNULL
gaogzhenscorePRIMARYRECORDS,REC_NOT_GAP1

第三步:窗口2 加表共享锁(read)

mysql> lock tables score read;
Query OK, 0 rows affected (0.01 sec)

mysql> unlock tables
    -> ;
Query OK, 0 rows affected (0.01 sec)

第四步:窗口2 加表排它锁(write),阻塞。

在这里插入图片描述

第五步:窗口1提交事务,窗口2阻塞解除。

在这里插入图片描述

第六步:窗口1开启事务,添加意向排它锁(IX)

begin;
update score set math=88 where id=1;
object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenscoreNULLTABLEIXNULL
gaogzhenscorePRIMARYRECORDX,REC_NOT_GAP1

第七部:窗口2执行加表锁操作及及意向锁操作

lock tables score read;
-- 阻塞,窗口1重新开启事务添加意向排它锁IX
lock tables score write;
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
-- 阻塞,窗口1重新开启事务添加意向排它锁IX
update score set math=88 where id=2;
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenscoreNULLTABLEIXNULL
gaogzhenscorePRIMARYRECORDX,REC_NOT_GAP2
gaogzhenscoreNULLTABLEIXNULL
gaogzhenscorePRIMARYRECORDX,REC_NOT_GAP1

4 行锁

4.1 概述

行级锁,每次操作锁住对应的行数据。锁粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB引擎中。

InnoDB引擎的数据是基于索引组织的,行锁通过对索引上加锁来实现的,而不是对记录加的锁。

  • 行锁分类:
    • 行锁(Record Lock):锁定单个行记录,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持;
    • 间隙锁(Gap Lock): 锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他记录在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
    • 临建锁(Next-Key Lock):行锁和间隙锁的结合,同时锁住行数据,并锁住当前行数据前面的间隙。在RR隔离级别下支持。

在这里插入图片描述

4.2 行锁

InnoDB实现了一些两种类型的行锁:

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁;
  • 排它锁(X):允许获取排它锁的事务更新数据,阻止其他事务获取相同数据集的共享锁和排它锁。
请求锁类型S(共享锁)X(排它锁)
S(共享锁)兼容冲突
X(排它锁)冲突冲突
  • 加锁
SQL行锁类型说明
insert \update\deleteX(排它锁)自动加锁
select …不加任何锁
select … lock in share modeS(共享锁)手动在select之后加lock in share mode
select … for updateX(排它锁)手动在select之后加for update
  • 说明

默认情况下,InnoDB在REPEATABLE READ 事务隔离级别下运行,InnoDB使用Next-Key Lock锁(临建锁)进行搜索和索引扫描,以防止幻读。

  1. 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,自动优化为行锁;
  2. InnoDB的行锁是针对索引加的锁,不通过索引条件检索数据,那么InnoDB引擎将对表中的所有记录加锁,此时升级为表锁。
  • 查看意向锁及行锁加锁

    select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
    
  • 演示

初始化:窗口1开启事务,执行普通的select ,窗口2查看加锁情况

select * from score where id=1;
-- 无锁
Empty set (0.01 sec)

第一步:窗口1加共享行锁,再次查看

select * from score where id=1 lock in share mode;

查询结果如下表4.2-1所示:

object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenscoreNULLTABLEISNULL
gaogzhenscorePRIMARYRECORDS,REC_NOT_GAP1

第二步:窗口2开启事务,也对相同行加共享行锁,查看锁情况

select * from score where id=1 lock in share mode;
object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenscoreNULLTABLEISNULL
gaogzhenscorePRIMARYRECORDS,REC_NOT_GAP1
gaogzhenscoreNULLTABLEISNULL
gaogzhenscorePRIMARYRECORDS,REC_NOT_GAP1

第三步:窗口2 提交事务,重新开启事务对id=3的数据行执行修改操作

update score name='Java' where id=3;
  • 不阻塞,正常更新,不同数据集之间行锁不会冲突。
object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenscoreNULLTABLEIXNULL
gaogzhenscorePRIMARYRECORDX,REC_NOT_GAP3
gaogzhenscoreNULLTABLEISNULL
gaogzhenscorePRIMARYRECORDS,REC_NOT_GAP1

第四步:窗口2对id=1的数据行执行更新操作

update score set name='Java' where id=1;
-- 窗口2事务行锁
 gaogzhen      | score       | PRIMARY    | RECORD    | X,REC_NOT_GAP | 1 
  • 窗口2阻塞

其他情况不在测试,有兴趣自行测试

第五步:测试无索引更新与添加索引后的更新

-- 重新开启事务
begin;
-- 窗口1 通过name字段更新分数
update score set math=88 where name='Tom';

查看加锁情况,对所有记录加锁

object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenscoreNULLTABLEIXNULL
gaogzhenscorePRIMARYRECORDXsupremum pseudo-record
gaogzhenscorePRIMARYRECORDX1
gaogzhenscorePRIMARYRECORDX2
gaogzhenscorePRIMARYRECORDX3

窗口2执行更新操作,阻塞

给name字段添加索引

create index idx_score_name on score(`name`);

再次执行上述操作,窗口1根据name字段跟新数据

4.3 间隙锁&临建锁

默认情况下,InnoDB在REPEATABLE READ 事务隔离级别下运行,InnoDB使用Next-Key Lock锁(临建锁)进行搜索和索引扫描,以防止幻读。

  1. 索引上的等值查询(唯一索引)

    • 记录存在时,对应索引添加行锁
    • 给不存在记录加锁时,优化为间隙锁,即向右边遍历第一个不满足条件索引加间隙锁;
  2. 索引上的等值查询(普通索引)

    • 记录存在时,对应的主键索引添加行锁;普通索引对应的记录前后加临建锁;
    • 记录不存在时向右遍历至第一个不满足查询需求时next-key lock 退化为间隙锁;
  3. 索引上的范围查询

    • 唯一索引:范围内添加临建锁

    • 普通索引:对应普通索引范围内添加临建锁;对应存在主键索引添加行锁。

说明:对于表中最大值之后的临建锁怎么加的呢

  • 示例:| gaogzhen | stu | idx_stu_age | RECORD | S | supremum pseudo-record |

  • supremum pseudo-record:上界伪记录即无穷大到记录对应查询最大值之间的间隙

测试表stu如下所示:

idagename
12tom
34cat
89rose
1112jetty
1920lily
2526luci
  • 测试更新id=5的行数据

    update stu set age=20 where id=5;
    

sss

加锁情况如下表所示:

object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenstuNULLTABLEIXNULL
gaogzhenstuPRIMARYRECORDX,GAP8
  • 索引:主键索引
  • 锁类型:行锁
  • 锁模式:排它锁,间隙锁。
  • 锁的间隙:id 3~8之间的间隙,不包含id为3和8的间隙

验证一下,插入一条id=7的数据

insert into stu values(7, 20, 'Lucy');
  • 窗口2阻塞

  • 测试普通索引等值查询

在age字段创建普通索引,窗口1开启事务,执行查询

create index idx_stu_age on stu(`age`);
begin;
select * from stu where age=4 lock in share mode;

查看加锁情况:

object_schemaobject_nameindex_namelock_typelock_modelock_data
gaogzhenstuNULLTABLEISNULL
gaogzhenstuidex_stu_ageRECORDS4, 3
gaogzhenstuPRIMARYRECORDS,REC_NOT_GAP3
gaogzhenstuidx_stu_ageRECORDS,GAP9, 8
  • 第二条记录,索引类型idx_stu_age,锁模式S临建锁,lock_date age=4对应主键3
    • 锁住age=4及之前的间隙即age=2记录到age=4之间间隙及age=4记录对应的索引
  • 第三条记录,锁住id=3对应的主键索引
  • 第四条,锁住age=4之后的间隙,即age 4~9之间的间隙对应的

其他情况自行测试。lock_mode标志如下表所示

行锁间隙锁临建锁
共享锁S,REC_NOT_GAPS,GAPS
排它锁X,REC_NOT_GAPX,GAPX

5 小结

5.1 概述

  • 在并发访问数据库时,解决数据的一致性、有效性问题;
  • 分类:全局锁、表级锁、行级锁。

5.2 全局锁

  • 对整个数据库加锁,加锁后整个数据库实例处于只读状态;
  • 性能较差,数据逻辑备份时使用。

5.3 表锁

  • 操作时锁住整张表,锁粒度大,发生锁冲突概率高;
  • 分类:表锁、元数据锁、意向锁。

5.4 行锁

  • 操作锁住对应的行数据,锁粒度最小,发生锁冲突的概率最低;
  • 分类:行锁、间隙锁、临建锁。

结语

如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

参考链接:

[1]MySQL数据库视频[CP/OL].2020-04-16.p122-132.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决QtCreator安卓平台原生C++代码无法输出日志问题

1.需求,因原生C++调用std::cout ,std::cerr,及C函数prinf输出要显示在控制台, 问题: 在QtCreator中只看到qDebug输的日志,并没有看到 cout,cerr,printf的输出日志 2.最终已解决如下 在QtCreator中显示了C++原生日志 在Android Studio 的Logcat中显示了C++原生日志 模拟器 …

c++11 标准模板(STL)(std::basic_ostream)(三)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

印刷企业WMS仓储管理系统解决方案

在数字化转型的浪潮中&#xff0c;印刷企业也积极寻求适合自身发展的解决方案。作为印刷业的重要环节&#xff0c;仓储管理对于提高效率、降低成本至关重要。而印刷企业WMS仓储管理系统的应用&#xff0c;为印刷企业带来了全新的解决方案。 印刷WMS仓储管理系统是一种基于信息技…

简单认识Tomcat的部署和优化

文章目录 一、简单认识Tomcat1、简介2、构成3、Tomcat 功能组件结构4、Tomcat 请求过程&#xff1a; 二、Tomcat部署1.关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下2.安装JDK3.设置JDK环境变量4.测试java环境5.安装Tomcat6.启动和关闭Tomcat7.优化 tomcat 启…

synchronized锁升级以后会再降级吗?

Java对象头Markword的结构 其中&#xff0c;最低2位是10代表重量级锁&#xff0c;00代表轻量级锁&#xff0c;001代表无锁&#xff0c;101代表偏向锁。 synchronized锁在1.6的时候做了优化&#xff0c;当仅有一个线程竞争锁的时候&#xff0c;锁处于偏向锁的状态&#xff0c;当…

bim技术的发展趋势是哪些方向?

BIM在现阶段已经取得了较高的发展水平。尽管BIM在许多方面取得了显著进展&#xff0c;但仍有继续改进和发展的空间。未来&#xff0c;BIM在数字化转型、智能化应用和全生命周期管理方面的进一步推进将成为发展重点。简单聊聊BIM技术的发展趋势包括以下几个方向&#xff1a; BIM…

Java面试通关:阿里内部实战模拟面试精讲题库,竟被上传GitHub!

其实这些技术在真正的实际开发环境中真的用得到吗&#xff1f;不一定的&#xff0c;但是没办法&#xff0c;环境就是如此&#xff0c;能做的也就只有不断提升自己&#xff0c;去适应市场环境&#xff0c;提高自身技术水平&#xff01; 我的建议&#xff0c;不管自己现在是个什…

2021北大生命科学院饶毅教授毕业致辞

在祝福裹挟着告诫呼啸而来的毕业季&#xff0c;请原谅我&#xff0c;不敢祝愿每一位毕业生都成功都幸福。因为历史不幸的记载着有人的成功&#xff0c;代价是丧失良知&#xff0c;有人的幸福&#xff0c;代价是损害他人。 从物理学来说&#xff0c;无机的原子&#xff0c;逆​热…

Loadrunner怎么实现MD5加密

目录 前言&#xff1a; 1、写一个md5.h文件&#xff0c;将其放入脚本路径下 2、在globals.h中加入#include “md5.h” 3、在Action中写脚本&#xff0c;脚本示例如下&#xff1a; 前言&#xff1a; 在 LoadRunner 中实现 MD5 加密可以通过使用 LoadRunner 提供的函数来完成…

Redis发布订阅的通讯模式

这个是非常简单的,我们只需要打开两个redis就可以轻松完成 通过Xshell工具两次连接linux,同时启动两个redis: 在第一个里面进行订阅: subscribe leq 在第二个里面进行发布: publish leq hello 这样就可以在订阅的里头看到刚刚发布的信息,没看之前订阅那块也会有提示

带纵深可跳跃横版闯关游戏模版

此项目是以《卡比猎人队》为蓝本开发的横版带纵深闯关游戏模版。内涵数据表配置文件。 购买链接&#xff1a; 微店购买链接 开发环境 开发引擎&#xff1a;CocosCreator3.6.3开发语言&#xff1a;TypeScript 包含的内容&#xff1a; 逻辑实现目录介绍&#xff08;game&am…

Visdom使用

Visdom Visdom是一个面向科学研究的可视化工具&#xff0c;可以帮助你可视化和理解数据。它是 Facebook Research 开发的一个基于 Python 的可视化库&#xff0c;可以在Web浏览器中实时显示和更新图表、图像、文本等各种数据。 1 安装Visdom 可以使用以下命令安装Visdom&…

海思平台图像的IQ调试

目录 1.何为ISP何为IQ调试 1.1、ISP概念 1.2、在哪里做ISP 1.3、何为IQ 1.4、总结 2.海思MPP中ISP的实现框架 2.1、官方文档 2.2、sample中ISP相关部分 2.3、sensor注册内部细节 2.4、ISP注册内部细节 3.IQ调试相关的概念 3.1、黑电平 3.2、镜头阴影矫正 3.3、坏点…

《移动互联网技术》第十一章 Android应用工程案例: 掌握Android系统的需求分析和设计以及 Android项目的程序测试和版本管理方法

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

1208道Java面试题(2023突击版),覆盖互联网大厂核心知识点

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

需求分析引言:架构漫谈(三)可用性专题

前文介绍了非功能性需求的各个指标和一些业界的标准。 非功能性需求里有一项可靠性&#xff0c;与之关联的一个指标叫可用性 本文对非功能性需求里的可用性、可靠性&#xff0c;进行一些详细的说明。 概念 我们在网上的云服务商处&#xff0c;经常看到产品介绍里会有这种字样…

Redis【实战篇】---- 分布式锁-redission

Redis【实战篇】---- 分布式锁-redission 1. 分布式锁-redission功能介绍2. 分布式锁-redission快捷入门3. 分布式锁-redission可重入锁原理4. 分布式锁-redission锁重试和WatchDog机制5. 分布式锁-redission锁的MutiLock原理 1. 分布式锁-redission功能介绍 基于setnx实现的分…

【AcWing算法基础课】第一章 基础算法(部分待更)

文章目录 前言课前温习一、快速排序核心模板1.1题目描述1.2思路分析1.3代码实现 二、归并排序核心模板2.1题目描述2.2思路分析2.3代码实现 三、二分查找整数二分题目一3.1题目描述3.2思路分析3.3代码实现 浮点数二分题目二3.1题目描述3.2思路分析3.3代码实现 四、高精度加法核心…

SpringBoot实战(十八)集成Feign

目录 一、简介1.定义2.关键特征 二、Maven依赖三、编写代码1.DemoController.java2.DemoFeignClient.java3.启动类注解 EnableFeignClients 四、测试 一、简介 1.定义 OpenFeign&#xff1a;是由 Netflix 开发的声明式的 Web 服务客户端。它简化了向 RESTful Web 服务发送 HT…

python接口自动化(八)--发送post请求的接口(详解)

简介 上篇介绍完发送get请求的接口&#xff0c;大家必然联想到发送post请求的接口也不会太难&#xff0c;被聪明的你又猜到了。答案是对的&#xff0c;虽然发送post请求的参考例子很简单&#xff0c;但是实际遇到的情况却是很复杂的&#xff0c;因为所有系统或者软件、网站都是…