Mysql锁机制介绍

Mysql锁机制

锁是计算机协调多个进程或线程并发访问某一资源的机制。

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

使用锁会影响数据库的性能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFAexPah-1687868884430)(assets/1687868819251-166.png)]

锁的分类

从对数据操作的类型(读/写)分

  • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
  • 写锁(排它锁):当前写操作没有完成前,他会阻断其他写锁和读锁

从对数据操作的粒度分

表锁(偏读)

锁住整个表

特点:表锁偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。

表锁演示
建表sql
create table mylock (
id int not null primary key auto_increment,
name varchar(20) default ''
) engine myisam;insert into mylock(name) values('a');
insert into mylock(name) values('b');
insert into mylock(name) values('c');
insert into mylock(name) values('d');
insert into mylock(name) values('e');

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtZEUEKc-1687868884431)(assets/1687868819251-167.png)]

加锁、解锁命令

查看数据库中的哪些表加过锁

SHOW OPEN TABLES;
mysql> use advanced_mysql_learning;
Database changed
mysql> SHOW OPEN TABLES;
+-------------------------+---------------------------+--------+-------------+
| Database                | Table                     | In_use | Name_locked |
+-------------------------+---------------------------+--------+-------------+
| mysql                   | check_constraints         |      0 |           0 |
| mysql                   | column_type_elements      |      0 |           0 |
| mysql                   | slave_master_info         |      0 |           0 |
| mysql                   | foreign_keys              |      0 |           0 |
| mysql                   | columns                   |      0 |           0 |
| mysql                   | foreign_key_column_usage  |      0 |           0 |
| mysql                   | server_cost               |      0 |           0 |
| mysql                   | index_column_usage        |      0 |           0 |
| mysql                   | view_table_usage          |      0 |           0 |
| mysql                   | index_partitions          |      0 |           0 |
| mysql                   | indexes                   |      0 |           0 |
| mysql                   | schemata                  |      0 |           0 |
| mysql                   | collations                |      0 |           0 |
| mysql                   | table_partition_values    |      0 |           0 |
| mysql                   | table_partitions          |      0 |           0 |
| mysql                   | tables                    |      0 |           0 |
| mysql                   | role_edges                |      0 |           0 |
| mysql                   | triggers                  |      0 |           0 |
| mysql                   | column_statistics         |      0 |           0 |
| mysql                   | view_routine_usage        |      0 |           0 |
| mysql                   | gtid_executed             |      0 |           0 |
| mysql                   | engine_cost               |      0 |           0 |
| mysql                   | component                 |      0 |           0 |
| mysql                   | user                      |      0 |           0 |
| mysql                   | db                        |      0 |           0 |
| mysql                   | tables_priv               |      0 |           0 |
| mysql                   | columns_priv              |      0 |           0 |
| performance_schema      | session_status            |      0 |           0 |
| mysql                   | procs_priv                |      0 |           0 |
| mysql                   | proxies_priv              |      0 |           0 |
| mysql                   | default_roles             |      0 |           0 |
| mysql                   | global_grants             |      0 |           0 |
| mysql                   | servers                   |      0 |           0 |
| mysql                   | password_history          |      0 |           0 |
| mysql                   | time_zone_transition      |      0 |           0 |
| mysql                   | time_zone_leap_second     |      0 |           0 |
| mysql                   | table_stats               |      0 |           0 |
| mysql                   | time_zone_name            |      0 |           0 |
| mysql                   | time_zone                 |      0 |           0 |
| advanced_mysql_learning | mylock                    |      0 |           0 |
| mysql                   | time_zone_transition_type |      0 |           0 |
| mysql                   | tablespace_files          |      0 |           0 |
| mysql                   | func                      |      0 |           0 |
| mysql                   | slave_relay_log_info      |      0 |           0 |
| information_schema      | TABLES                    |      0 |           0 |
| mysql                   | slave_worker_info         |      0 |           0 |
| mysql                   | routines                  |      0 |           0 |
| mysql                   | events                    |      0 |           0 |
| mysql                   | catalogs                  |      0 |           0 |
| information_schema      | SCHEMATA                  |      0 |           0 |
| mysql                   | character_sets            |      0 |           0 |
| advanced_mysql_learning | emp                       |      0 |           0 |
| mysql                   | tablespaces               |      0 |           0 |
| performance_schema      | session_variables         |      0 |           0 |
| information_schema      | COLUMNS                   |      0 |           0 |
| information_schema      | ROUTINES                  |      0 |           0 |
| information_schema      | PARAMETERS                |      0 |           0 |
| mysql                   | parameters                |      0 |           0 |
| information_schema      | VIEWS                     |      0 |           0 |
+-------------------------+---------------------------+--------+-------------+
59 rows in set (0.00 sec)

In_use的值为0,代表该表没有加过锁;值为1,代表该表已加锁

给mylock表上读锁(READ),给book表上写锁(WRITE)

LOCK TABLE mylock READ, book WRITE;
mysql> LOCK TABLE mylock READ, book WRITE;
Query OK, 0 rows affected (0.00 sec)mysql> SHOW OPEN TABLES;
+-------------------------+---------------------------+--------+-------------+
| Database                | Table                     | In_use | Name_locked |
+-------------------------+---------------------------+--------+-------------+
| mysql                   | check_constraints         |      0 |           0 |
| mysql                   | column_type_elements      |      0 |           0 |
| advanced_mysql_learning | book                      |      1 |           0 |
| mysql                   | slave_master_info         |      0 |           0 |
| mysql                   | foreign_keys              |      0 |           0 |
| mysql                   | columns                   |      0 |           0 |
| mysql                   | foreign_key_column_usage  |      0 |           0 |
| mysql                   | server_cost               |      0 |           0 |
| mysql                   | index_column_usage        |      0 |           0 |
| mysql                   | view_table_usage          |      0 |           0 |
| mysql                   | index_partitions          |      0 |           0 |
| mysql                   | indexes                   |      0 |           0 |
| mysql                   | schemata                  |      0 |           0 |
| mysql                   | collations                |      0 |           0 |
| mysql                   | table_partition_values    |      0 |           0 |
| mysql                   | table_partitions          |      0 |           0 |
| mysql                   | tables                    |      0 |           0 |
| mysql                   | role_edges                |      0 |           0 |
| mysql                   | triggers                  |      0 |           0 |
| mysql                   | column_statistics         |      0 |           0 |
| mysql                   | view_routine_usage        |      0 |           0 |
| mysql                   | gtid_executed             |      0 |           0 |
| mysql                   | engine_cost               |      0 |           0 |
| mysql                   | component                 |      0 |           0 |
| mysql                   | user                      |      0 |           0 |
| mysql                   | db                        |      0 |           0 |
| mysql                   | tables_priv               |      0 |           0 |
| mysql                   | columns_priv              |      0 |           0 |
| performance_schema      | session_status            |      0 |           0 |
| mysql                   | procs_priv                |      0 |           0 |
| mysql                   | proxies_priv              |      0 |           0 |
| mysql                   | default_roles             |      0 |           0 |
| mysql                   | global_grants             |      0 |           0 |
| mysql                   | servers                   |      0 |           0 |
| mysql                   | password_history          |      0 |           0 |
| mysql                   | time_zone_transition      |      0 |           0 |
| mysql                   | time_zone_leap_second     |      0 |           0 |
| mysql                   | table_stats               |      0 |           0 |
| mysql                   | time_zone_name            |      0 |           0 |
| mysql                   | time_zone                 |      0 |           0 |
| advanced_mysql_learning | mylock                    |      1 |           0 |
| mysql                   | time_zone_transition_type |      0 |           0 |
| mysql                   | tablespace_files          |      0 |           0 |
| mysql                   | func                      |      0 |           0 |
| mysql                   | slave_relay_log_info      |      0 |           0 |
| information_schema      | TABLES                    |      0 |           0 |
| mysql                   | slave_worker_info         |      0 |           0 |
| mysql                   | routines                  |      0 |           0 |
| mysql                   | events                    |      0 |           0 |
| mysql                   | catalogs                  |      0 |           0 |
| information_schema      | SCHEMATA                  |      0 |           0 |
| mysql                   | character_sets            |      0 |           0 |
| advanced_mysql_learning | emp                       |      0 |           0 |
| mysql                   | tablespaces               |      0 |           0 |
| performance_schema      | session_variables         |      0 |           0 |
| information_schema      | COLUMNS                   |      0 |           0 |
| information_schema      | ROUTINES                  |      0 |           0 |
| information_schema      | PARAMETERS                |      0 |           0 |
| mysql                   | parameters                |      0 |           0 |
| information_schema      | VIEWS                     |      0 |           0 |
+-------------------------+---------------------------+--------+-------------+
60 rows in set (0.00 sec)

解开所有表的锁

UNLOCK TABLES;
读锁案例

打开两个会话,SESSION1mylock表添加读锁。

--  为mylock表添加读锁
LOCK TABLE mylock READ;

打开两个会话,SESSION1是否可以读自己锁的表?是否可以修改自己锁的表?是否可以读其他的表?那么SESSION2呢?

SESSION1

-- SESSION1为mylock表加了读锁之后可以读mylock表
mysql> SELECT * FROM `mylock`;
+----+----------+
| id | name     |
+----+----------+
|  1 | a        |
|  2 | b        |
|  3 | c        |
|  4 | d        |
|  5 | e        |
+----+----------+
4 rows in set (0.00 sec)--  SESSION1为mylock表加了读锁之后,不支持修改mylock表
mysql> UPDATE `mylock` SET `name` = 'abc' WHERE `id` = 1;
ERROR 1099 (HY000): Table 'mylock' was locked with a READ lock and can't be updated--  SESSION1为mylock表加了读锁,不可以读其他的表!
mysql> SELECT * FROM `book`;
ERROR 1100 (HY000): Table 'book' was not locked with LOCK TABLES

SESSION2

--  SESSION1为mylock表加了读锁,SESSION2可以读mylock表!
mysql> SELECT * FROM `mylock`;
+----+----------+
| id | name     |
+----+----------+
|  1 | a        |
|  2 | b        |
|  3 | c        |
|  4 | d        |
|  5 | e        |
+----+----------+
4 rows in set (0.00 sec)--  SESSION1为mylock表加了读锁,SESSION2修改mylock表会被阻塞,需要等待SESSION1释放mylock表,才能执行语句
mysql> UPDATE `mylock` SET `name` = 'a' WHERE `id` = 10;
ERROR 1317 (70100): Query execution was interrupted--  SESSION1为mylock表加了读锁,SESSION2可以读其他表
mysql> SELECT * FROM `book`;
+--------+------+
| bookid | card |
+--------+------+
|      1 |    1 |
|      7 |    4 |
|      8 |    4 |
|      9 |    5 |
|      5 |    6 |
|     17 |    6 |
|     15 |    8 |
+--------+------+
24 rows in set (0.00 sec)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaUAre2m-1687868884431)(assets/1687868819251-168.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8bPiWWc-1687868884432)(assets/1687868819251-169.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mYWD8Dt6-1687868884432)(assets/1687868819251-170.png)]

写锁案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElB8YgRc-1687868884432)(assets/1687868819251-171.png)]

结论

**MyISAM**引擎

在执行查询语句**SELECT**之前,会自动给涉及到的所有表加读锁;

在执行增删改之前,会自动给涉及的表加写锁。

MySQL的表级锁有两种模式:

  • 表共享读锁(Table Read Lock)。
  • 表独占写锁(Table Write Lock)。

MyISAM表进行操作,会有以下情况:

  • MyISAM表的读操作(加读锁),不会阻塞其他线程(新建一个数据库连接就是其他线程)対同一表的读操作,但是会阻塞其他线程対同一表的写操作。只有当读锁释放之后,才会执行其他线程的写操作。
  • MyISAM表的写操作(加写锁),会阻塞其他线程対同一表的读和写操作,只有当写锁释放之后,才会执行其他线程的读写操作。

总结:读锁会阻塞写,但是不会阻塞读;写锁会把读和写都堵塞

表锁分析

如果有命令,可以知道锁了多长时间,锁的各种情况 ,就可以帮助我们更好地优化sql

查看哪些表被加锁

SHOW OPEN TABLES;
SHOW STATUS LIKE 'table%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Table_locks_immediate      | 16    |
| Table_locks_waited         | 0     |
| Table_open_cache_hits      | 0     |
| Table_open_cache_misses    | 0     |
| Table_open_cache_overflows | 0     |
+----------------------------+-------+
5 rows in set (0.00 sec)

可以通过Table_locks_immediateTable_locks_waited两个状态变量记录Mysql内部表级锁定的情况,具体说明如下:

Table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1。

Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在较严重的表级锁争用情况

**此外,****MyISAM的读写锁调度是写优先,这也是MyISAM**不适合作写为主表的引擎。因为写锁后,其他线程不能进行任何操作,大量的写操作会使查询很难得到锁,从而造成永远阻塞。

行锁(偏写)

偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

**InnoDB存储引擎和MyISAM**存储引擎最大不同有两点:一是支持事务,二是采用行锁。

事务 (Transaction)及其ACID属性

事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性

  • 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  • 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时所有的内部数据结构(如B树案引或双向链表)也都必须是正确的。
  • 隔离性(lsolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发作影响的”独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
  • 持久性 ( Durable ): 事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
并发事务处理带来的影响
  • 更新丢失:当两个或多个事各选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题一一最后的更新覆盖了由其他事务所做的更新。例如,两个程序员修改同一java文件。每程序员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖前一个程序员所做的更改。如果在一个程序员完成并提交事务之前,另一个程序员不能访问同一文件,则可避免此问题。
  • 脏读:一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。一句话:事务A读取到了事务B已修改但尚未提交的的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。
  • 不可重复读:一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除!这种现象就叫做“不可重复读”。一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性。
  • 幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。一句话: 事务A读取到了事务B提交的新增数据,不符合隔离性。多说一句:幻读和脏读有点类似,脏读是事务B里面修改了数据,幻读是事务B里面新增了数据
事务的隔离级别

“脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性可题,必须由数据库提供一定的事务隔离机制来解决。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtAsjVif-1687868884432)(assets/1687868819251-172.png)]

数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。

查看当前数据库的事务隔离级别

mysql> show variables like 'tx_isolation';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUMGVF4j-1687868884432)(assets/1687868819251-173.png)]

"可重复读"是数据库的默认隔离级别,可以避免脏读不可重复读,不可以避免幻读

行锁演示
建表sql
# 建表语句
CREATE TABLE `test_innodb_lock`(
`a` INT,
`b` VARCHAR(16)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='测试行锁'; # 插入数据
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(1, 'b2');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(3, '3');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(4, '4000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(5, '5000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(6, '6000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(7, '7000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(8, '8000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(9, '9000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(1, 'b1');# 创建索引
CREATE INDEX test_innodb_a_ind ON `test_innodb_lock`(a);
CREATE INDEX test_innodb_lock_b_ind ON `test_innodb_lock`(b);
mysql> select * from test_innodb_lock;
+------+------+
| a    | b    |
+------+------+
|    1 | b2   |
|    3 | 3    |
|    4 | 4000 |
|    5 | 5000 |
|    6 | 6000 |
|    7 | 7000 |
|    8 | 8000 |
|    9 | 9000 |
|    1 | b1   |
+------+------+
9 rows in set (0.00 sec)
行锁案例

开启手动提交

创建两个会话,两个会话都开启手动提交。

--  开启MySQL数据库的手动提交,取消自动提交
mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

读己知所写

大的系统都是分布式,数据强一致性和高并发不能同时满足,比如自己发个微博,可能别人要一两秒之后才可以看到,但是自己肯定第一时间就可以看到,故“读己知所写”

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

两个会话同时对一条记录进行修改

在这里插入图片描述

在这里插入图片描述

两个会话同时对不同记录进行修改

在这里插入图片描述

索引失效行锁变表锁

在这里插入图片描述

行锁变成表锁会导致系统变慢

间隙锁的危害

在这里插入图片描述

什么是间隙锁?

当我们用范围条件而不是相等条件检索数据,并请求共享或者排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁,对于键值在条件范围内但并不存在的记录,叫做"间隙(GAP)"。

InnoDB也会对这个"间隙"加锁,这种锁的机制就是所谓的"间隙锁"。

间隙锁的危害

因为Query执行过程中通过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值不存在。

间隙锁有一个比较致命的缺点,就是当锁定一个范围的键值后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。某些场景下这可能会対性能造成很大的危害

如何锁定一行

在这里插入图片描述

在这里插入图片描述

行锁分析
mysql> SHOW STATUS LIKE 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 0     |
| Innodb_row_lock_time_avg      | 0     |
| Innodb_row_lock_time_max      | 0     |
| Innodb_row_lock_waits         | 0     |
+-------------------------------+-------+
5 rows in set (0.00 sec)

対各个状态量的说明如下:

  • Innodb_row_lock_current_waits:当前正在等待锁定的数量。
  • Innodb_row_lock_time:从系统启动到现在锁定总时间长度(等待总时长)。
  • Innodb_row_lock_time_avg:每次等待所花的平均时间(等待平均时长)。
  • Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间。
  • Innodb_row_lock_waits:系统启动后到现在总共等待的次数(等待总次数)。

当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手制定优化策略。

案例结论

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定的。当系统并发量较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势了。

但是,InnoDB的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差。

页锁

开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般(了解一下即可)

优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能减少检索条件,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度
  • 尽可能使用低级别事务隔离

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】最长递增子序列:动态规划贪心+二分查找

文章目录 最长递增子序列解法一:动态规划解法二:LIS 和 LCS 的关系解法三:贪心 二分查找 相关题目673. 最长递增子序列的个数 https://leetcode.cn/problems/number-of-longest-increasing-subsequence/1964. 找出到每个位置为止最长的有效障…

理解mysql数据库

1.MySQL 在 Centos 7环境安装 1.1 卸载不要的环境 ps ajx |grep mariadb # 先检查是否有 mariadb 存在 systemctl stop mariadb.service # 停⽌ mariadb 服务 ps ajx |grep mariadb # 再 检查是否有 mariadb 存在 1.2 删除多余的安装包 rpm -qa | grep mysql #查看默认安装…

Unity内置渲染管线升级URP教程

简介 URP全称为Universal Render Pipeline(通用渲染管线),可以提供更加灵活的渲染方案,通过添加Render Feature实现各种渲染效果。并且可以针对移动平台进行专门的优化,同时还提供了SRPBatcher提高渲染效率。Unity的一些工具,比如…

《项目实战》构建SpringCloud alibaba项目(三、构建服务方子工程store-user-service)

系列文章目录 构建SpringCloud alibaba项目(一、构建父工程、公共库、网关) 构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service) 构建SpringCloud alibaba项目(三、构建服务方子工程stor…

95道MongoDB面试题

1、mongodb是什么? MongoDB 是由 C语言编写的,是一个基于分布式文件存储的开源数据库系统。 再高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数…

前端技术栈 - ES6 - Promise -模块化编程

文章目录 🕛ES6⚡let变量⚡const常量⚡数组解构⚡对象解构⚡模板字符串⚡对象声明简写⚡对象方法简写⚡对象运算符扩展⚡箭头函数⚡作业布置 🕐Promise⚡需求分析⚡传统ajax回调嵌套⚡promise改进⚡promise异常捕获⚡promise链式调用⚡promise代码重排优…

Spark 3.4.x Server Client模式下的数据传输实现

背景 在Spark中python和jvm的通信杂谈–ArrowConverter中,我们提到Spark 3.4.x中是Client和Server之间的数据传输是采用Arrow IPC的,那具体是怎么实现的呢? 分析 直接上代码ClientE2ETestSuite test("createDataFrame from complex t…

Redis————主从架构

主从架构搭建 单机多实例 粗制一份redis.conf文件 将相关配置修改为如下值: port 与主节点端口后不相同即可 pidfile pid进程号保存文件pidfile的路径 logfile 日志文件名称 dir 指定数据存放目录 #需要注释掉bind #bind 127.0.0.1(bind绑定的是自己机…

Git使用与配置

Git分布式版本控制工具 一、Git安装与配置 Git基本配置 打开Git Bash 设置用户信息 # 配置用户名和用户邮箱 git config --global user.name xxx git config --global user.email xxxxx.com查看用户信息 # 查看用户名和用户邮箱 git config --global user.name git config --g…

【前端|CSS系列第1篇】CSS零基础入门之CSS的基本概念和选择器

欢迎来到CSS零基础入门系列的第一篇博客!在这个系列中,我们将一起学习CSS(层叠样式表)的基础知识,探索如何为网页添加样式和布局。本篇博客将重点介绍CSS的基本概念和选择器,帮助你理解CSS的核心概念。 1.…

【数据结构OJ题】链表带环问题

目录 1.判断链表是否带环 证明 2.寻找环的入口点 1.判断链表是否带环 原题链接:力扣 思路一:先遍历一遍链表,计算出链表的长度,然后将长度除二,在遍历半个链表即可。但是这种方法效率比较低。 思路二:…

学习一波Java语言中的优先队列 PriorityQueue

目录 一、什么是优先队列 二、PriorityQueue 如何使用 三、优先队列的使用场景 一、什么是优先队列 优先队列是一种特殊的队列数据结构,它根据元素的优先级来确定元素的顺序。与普通队列不同的是,优先队列中的元素并不按照插入的先后顺序进行排列&am…