06 mysql all查询 和 主键查询 和 非索引列查询

前言

本文主要调试一下 mysql 的如下两种查询语句 

我们也来深入的看一下, 究竟如下两个普通的查询, mysql 做了什么事情 

1. select * from `user` where id = '991';

2. select * from `user`;

3. select * from `user` where name = 'jerry991';

 

 

环境介绍

测试表 `user` schema 如下 

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`age` int(11) DEFAULT '0',`name` varchar(64) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

`user` 表中的测试数据如下 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

 

select * from `user` where id = '991'

我们这里会着重介绍这个 case, 这里面会详细的看一下 index page, data page 的情况, 以及其具体的执行的流程 

另外这个过程中我们会忽略掉一些细节, 尽量只查看这个业务查询的核心业务流程 

 

 

获取 index page 

index -> page 为 3, 表示第三个 page 为索引页面, pageNo 初始化为 index->page, 该 page 的地址为 block->frame : 0x1217f4000 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们 inspect 一下 0x1217f4000 

可以看出 offset 为 3, 对应于上面的 pageNo 

pagePrev, pageNext 为 0xffffffff, 表示只有一个索引页面 

pageNDirSlots 表示当前 page 存在两个 pageDirectory 

pageHeapTop 表示当前页面的 FreeSpace 位于 0xa2 

pageNHeap 表示有 5 个元素, 三个索引元素 + infimum + supremum 

pageNRecords 表示有三个索引元素 

pageLevel 为 1 表示下面一级才是叶子节点[存储数据的节点] 

再看下面的索引信息 [1, 302) -> page4, [302, 719) -> page5, [719, supremum] -> page6 

(lldb) x 0x1217f4000 -c 0x100
0x1217f4000: c2 b7 03 ad 00 00 00 03 ff ff ff ff ff ff ff ff  ·.�....��������
0x1217f4010: 00 00 00 00 00 1d 34 e5 45 bf 00 00 00 00 00 00  ......4�E�......
0x1217f4020: 00 00 00 00 00 06 00 02 00 a2 80 05 00 00 00 00  .........�......
0x1217f4030: 00 9a 00 02 00 02 00 03 00 00 00 00 00 00 00 00  ................
0x1217f4040: 00 01 00 00 00 00 00 00 00 16 00 00 00 06 00 00  ................
0x1217f4050: 00 02 00 f2 00 00 00 06 00 00 00 02 00 32 01 00  ...�.........2..
0x1217f4060: 02 00 1b 69 6e 66 69 6d 75 6d 00 04 00 0b 00 00  ...infimum......
0x1217f4070: 73 75 70 72 65 6d 75 6d 00 10 00 11 00 0e 80 00  supremum........
0x1217f4080: 00 01 00 00 00 04 00 00 00 19 00 0e 80 00 01 2e  ................
0x1217f4090: 00 00 00 05 00 00 00 21 ff d6 80 00 02 cf 00 00  .......!��...�..
0x1217f40a0: 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1217f40b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1217f40c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1217f40d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1217f40e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1217f40f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................# FileHeader 
FIL_PAGE_SPACE = c2 b7 03 ad 
FIL_PAGE_OFFSET = 00 00 00 03 
FIL_PAGE_PREV = ff ff ff ff 
FIL_PAGE_NEXT = ff ff ff ff 
FIL_PAGE_LSN = 00 00 00 00 00 1d 34 e5 
FIL_PAGE_TYPE = 45 bf 
FIL_PAGE_FILE_FLUSH_LSN = 00 00 00 00 00 00 00 00 
FIL_PAGE_ARCH_LOG_NO = 00 00 00 06 # PageHeader 
PAGE_N_DIR_SLOTS = 00 02 
PAGE_HEAP_TOP = 00 a2 
PAGE_N_HEAP = 80 05 
PAGE_FREE = 00 00 
PAGE_GARBAGE = 00 00 
PAGE_LAST_INSERT = 00 9a 
PAGE_DIRECTION = 00 02 
PAGE_N_DIRECTION = 00 02 
PAGE_N_RECS = 00 03 
PAGE_MAX_TRX_ID = 00 00 00 00 00 00 00 00 
PAGE_LEVEL = 00 01 
PAGE_INDEX_ID = 00 00 00 00 00 00 00 16 
PAGE_BTR_SEG_LEAF = 00 00 00 06 00 00 00 02 00 f2 
PAGE_BTR_SEG_TOP = 00 00 00 06 00 00 00 02 00 32 # page4
0x 00 = nulls
0x 1 = delete flag
0x 0 = number of records owned by the record
0b 0000 0000 0001 0 = 2 = order number of this record
0b 001 = node pointer (inside B-tree)
0x 00 0e = next record offset -> page05
minId = 0x 80 00 00 01 = 1
pageNo = 0x 00 00 00 04# page5
0x 00 = nulls
0x 0 = delete flag
0x 0 = number of records owned by the record
0b 0000 0000 0001 1 = 3 = order number of this record
0b 001 = node pointer (inside B-tree)
0x 00 0e = next record offset -> page06
minId = 0x 80 00 01 2e = 302
pageNo = 0x 00 00 00 05# page6
0x 00 = nulls
0x 0 = delete flag
0x 0 = number of records owned by the record
0b 0000 0000 0010 0 = 4 = order number of this record
0b 001 = node pointer (inside B-tree)
0x ff d6 = next record offset -> supremum
minId = 0x 80 00 02 cf = 719
pageNo = 0x 00 00 00 06

 

根据 index page 确定数据所在 page 

通过上面 index page 里面的索引信息, 以及我们这里查询的 991 限定来确定数据属于哪一个 page 

这里的查询会有两层搜索, 通过 pageDirectory 的搜索, 通过最近的 pageDirectory 线性查询目标索引, 这里 991 属于 page6 

看这里的 low_rec, 指向的记录就是上面的 [719, supremum] -> page6 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

获取数据 page 

pageNo 为 6, 获取 page6, 该 page 的地址为 block->frame : 0x121804000 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 inspect 一下 0x121804000

(lldb) x 0x121804000 -c 0x100 
0x121804000: e5 86 89 21 00 00 00 06 00 00 00 05 ff ff ff ff  �..!........����
0x121804010: 00 00 00 00 00 1d a6 f8 45 bf 00 00 00 00 00 00  ......��E�......
0x121804020: 00 00 00 00 00 06 00 47 27 fc 81 1b 00 00 00 00  .......G'�......
0x121804030: 27 df 00 02 01 18 01 19 00 00 00 00 00 00 00 00  '�..............
0x121804040: 00 00 00 00 00 00 00 00 00 16 00 00 00 00 00 00  ................
0x121804050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00  ................
0x121804060: 02 00 1c 69 6e 66 69 6d 75 6d 00 06 00 0b 00 00  ...infimum......
0x121804070: 73 75 70 72 65 6d 75 6d 08 00 00 00 10 00 24 80  supremum......$.
0x121804080: 00 02 cf 00 00 00 00 41 75 f1 00 00 01 e7 01 10  ..�....Au�...�..
0x121804090: 80 00 00 16 6a 65 72 72 79 37 31 39 08 00 00 00  ....jerry719....
0x1218040a0: 18 00 24 80 00 02 d0 00 00 00 00 41 76 f2 00 00  ..$...�....Av�..
0x1218040b0: 01 e8 01 10 80 00 00 16 6a 65 72 72 79 37 32 30  .�......jerry720
0x1218040c0: 08 00 00 00 20 00 24 80 00 02 d1 00 00 00 00 41  .... .$...�....A
0x1218040d0: 77 f3 00 00 01 e9 01 10 80 00 00 16 6a 65 72 72  w�...�......jerr
0x1218040e0: 79 37 32 31 08 00 04 00 28 00 24 80 00 02 d2 00  y721....(.$...�.
0x1218040f0: 00 00 00 41 78 f4 00 00 01 ea 01 10 80 00 00 16  ...Ax�...�......# FileHeader 
FIL_PAGE_SPACE = e5 86 89 21 
FIL_PAGE_OFFSET = 00 00 00 06 
FIL_PAGE_PREV = 00 00 00 05 
FIL_PAGE_NEXT = ff ff ff ff 
FIL_PAGE_LSN = 00 00 00 00 00 1d a6 f8 
FIL_PAGE_TYPE = 45 bf 
FIL_PAGE_FILE_FLUSH_LSN = 00 00 00 00 00 00 00 00 
FIL_PAGE_ARCH_LOG_NO = 00 00 00 06 # PageHeader 
PAGE_N_DIR_SLOTS = 00 47 
PAGE_HEAP_TOP = 27 fc 
PAGE_N_HEAP = 81 1b 
PAGE_FREE = 00 00 
PAGE_GARBAGE = 00 00 
PAGE_LAST_INSERT = 27 df 
PAGE_DIRECTION = 00 02 
PAGE_N_DIRECTION = 01 18 
PAGE_N_RECS = 01 19 
PAGE_MAX_TRX_ID = 00 00 00 00 00 00 00 00 
PAGE_LEVEL = 00 00 
PAGE_INDEX_ID = 00 00 00 00 00 00 00 16 
PAGE_BTR_SEG_LEAF = 00 00 00 00 00 00 00 00 00 00 
PAGE_BTR_SEG_TOP = 00 00 00 00 00 00 00 00 00 00 # UserRecords 
jerry719 -> jerry720 -> jerry721 ... -> jerry999

 

我们来 inspect 一下 0x121807f00

从上面元数据可以知道, pageDirectory 总共有 71 个, 合计 142 字节, 加上末尾的 8 字节 FileTailer 合计 150 字节 

0x121807fff - 0x121807f6a + 1 = 0x96 = 150 字节 

可以看到这里的 pageDirectory 也是逆序排列的 infimum -> 0xeb -> 0x017b -> ... -> supremum [根据 id 排序]

(lldb) x 0x121807f00 -c 0x100
0x121807f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x121807f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x121807f20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x121807f30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x121807f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x121807f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x121807f60: 00 00 00 00 00 00 00 00 00 00 00 70 27 2b 26 9b  ...........p'+&.
0x121807f70: 26 0b 25 7b 24 eb 24 5b 23 cb 23 3b 22 ab 22 1b  &.%{$�$[#�#;"�".
0x121807f80: 21 8b 20 fb 20 6b 1f db 1f 4b 1e bb 1e 2b 1d 9b  !. � k.�.K.�.+..
0x121807f90: 1d 0b 1c 7b 1b eb 1b 5b 1a cb 1a 3b 19 ab 19 1b  ...{.�.[.�.;.�..
0x121807fa0: 18 8b 17 fb 17 6b 16 db 16 4b 15 bb 15 2b 14 9b  ...�.k.�.K.�.+..
0x121807fb0: 14 0b 13 7b 12 eb 12 5b 11 cb 11 3b 10 ab 10 1b  ...{.�.[.�.;.�..
0x121807fc0: 0f 8b 0e fb 0e 6b 0d db 0d 4b 0c bb 0c 2b 0b 9b  ...�.k.�.K.�.+..
0x121807fd0: 0b 0b 0a 7b 09 eb 09 5b 08 cb 08 3b 07 ab 07 1b  ...{.�.[.�.;.�..
0x121807fe0: 06 8b 05 fb 05 6b 04 db 04 4b 03 bb 03 2b 02 9b  ...�.k.�.K.�.+..
0x121807ff0: 02 0b 01 7b 00 eb 00 63 14 23 33 ed 00 1d a6 f8  ...{.�.c.#3�..��

 

根据数据page 定位 id = 991

这里的查询会有两层搜索, 通过 pageDirectory 的搜索, 通过最近的 pageDirectory 线性查询目标索引, 这里 991 对应于 up_rec  

看这里的 up_rec, 指向的记录就是上面的 (991, 22, jerry991) 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 inspect 一下 up_rec, 正是我们这里期望查询的 id = '991' 对应的记录 

(lldb) x 0x1218066bf
0x1218066bf: 80 00 03 df 00 00 00 00 42 85 81 00 00 01 32 01  ...�....B.....2.
0x1218066cf: 10 80 00 00 16 6a 65 72 72 79 39 39 31 08 00 00  .....jerry991...

 

外部的业务函数 row_search_for_mysql

上面这里查询到了 id = '991' 对应的记录, 封装在了 pcur->btr_cur->page_cur->rec 里面 

上面的流程是在 row_search_for_mysql 的 btr_pcur_open_with_no_init 这里, 这里的作用就是初始化 pcur, 为后面的业务迭代做准备 

接下来走的便是根据 pcur->btr_cur->page_cur->rec 进行迭代, 比较是否符合查询条件, 输出记录信息到客户端等等流程 

 

所以这里会做的事情是, 当前 rec 是在 id = '991', 然后 比较是否符合查询条件, 这里是符合, 然后将记录输出到客户端 

然后会进入 prebuilt->n_fetch_cached < MYSQL_FETCH_CACHE_SIZE 的条件, 继续下一个元素的迭代 

迭代到 rec 是在 id = '992', 然后 比较是否符合查询条件, 这里是不匹配, 走的时候 normal_return, 退出查询 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 inspect 一下 0x1218066bf

(lldb) x 0x1218066bf
0x1218066bf: 80 00 03 df 00 00 00 00 42 85 81 00 00 01 32 01  ...�....B.....2.
0x1218066cf: 10 80 00 00 16 6a 65 72 72 79 39 39 31 08 00 00  .....jerry991...

 

迭代元素 id = '992'

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 inspect 一下 0x1218066e3 

(lldb)  x 0x1218066e3
0x1218066e3: 80 00 03 e0 00 00 00 00 42 86 82 00 00 01 35 01  ...�....B.....5.
0x1218066f3: 10 80 00 00 16 6a 65 72 72 79 39 39 32 08 00 00  .....jerry992...

 

explain 的结果

我们来看一下 explain 的结果, 会使用 primary key 来索引, 大约会扫描 1 行记录

20210331094127251.png

 

 

select * from `user`

初始化 pcur->btr_cur->page_cur->rec

这个查询相对来说 走的流程比较简单, 查询的最小的 数据page的 infimum, 然后不断往后迭代, 直到所有元素迭代完成 

这里是初始化 pcur->btr_cur->page_cur->rec 为最小的 数据page的 infimum 

这里的迭代是从 index page 开始的, 从 level 最高的 index page 开始向下迭代, 如果是 fromLeft 表示最终取最小的数据页的 infimum, 如果是 !fromLeft 表示最终取最大的数据页的 supremum 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

根据 pcur->btr_cur->page_cur->rec 进行迭代 

然后接下来就是不断地向后迭代, 输出查询的元素信息到客户端 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

当前 page 到达了末尾, 切换到下一个 page 

btr_pcur_is_after_last_in_tree 判断当前 page 是否是最后一个 page, 判断的方式是 pageNext 是否为 0xffffffff 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

explain 的结果

我们来看一下 explain 的结果, 全表扫描, 大约会扫描 906 行记录

20210331094249330.png

 

 

select * from `user` where name = 'jerry991'

初始化 pcur->btr_cur->page_cur->rec 

这里的初始化过程 和上面的 "select * from `user`" 的初始化是一样的, 初始化 pcur->btr_cur->page_cur->rec 为 page4->infimum 

然后不断向后迭代数据, 直到全表的数据迭代完成 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 inspect 一下 这一页的数据 

(lldb) x 0x11cf1c000 -c 0x100
0x11cf1c000: 94 8c b5 2e 00 00 00 04 ff ff ff ff 00 00 00 05  ..�.....����....
0x11cf1c010: 00 00 00 00 00 1d 34 e5 45 bf 00 00 00 00 00 00  ......4�E�......
0x11cf1c020: 00 00 00 00 00 06 00 36 3b 0d 81 a3 1d b0 1d 64  .......6;..�.�.d
0x11cf1c030: 00 00 00 05 00 00 00 d0 00 00 00 00 00 00 00 00  .......�........
0x11cf1c040: 00 00 00 00 00 00 00 00 00 16 00 00 00 00 00 00  ................
0x11cf1c050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00  ................
0x11cf1c060: 02 00 1c 69 6e 66 69 6d 75 6d 00 01 00 0b 00 00  ...infimum......
0x11cf1c070: 73 75 70 72 65 6d 75 6d 05 00 00 00 10 00 21 80  supremum......!.
0x11cf1c080: 00 00 01 00 00 00 00 2b 07 04 00 00 01 56 04 7b  .......+.....V.{
0x11cf1c090: 80 00 00 1c 6a 65 72 72 79 04 00 00 00 18 00 20  ....jerry...... 
0x11cf1c0a0: 80 00 00 02 00 00 00 00 35 04 83 00 00 01 36 01  ........5.....6.
0x11cf1c0b0: 10 80 00 00 16 6c 75 63 79 06 00 00 00 20 00 22  .....lucy.... ."
0x11cf1c0c0: 80 00 00 05 00 00 00 00 3d 14 8a 00 00 01 91 01  ........=.......
0x11cf1c0d0: 10 80 00 00 16 6a 65 72 72 79 35 06 00 04 00 28  .....jerry5....(
0x11cf1c0e0: 00 22 80 00 00 07 00 00 00 00 3d 0b 84 00 00 01  ."........=.....
0x11cf1c0f0: 37 01 10 80 00 00 16 6a 65 72 72 79 37 06 00 00  7......jerry7...

 

根据 pcur->btr_cur->page_cur->rec 进行迭代 

然后接下来就是不断地向后迭代,  输出查询的元素信息到客户端 

todo, 这里根据条件过滤, 以及数据传递, 还需要再找找 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

 

完 

 

 

 

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

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

相关文章

机器学习之数据清洗

一、介绍 数据清洗是机器学习中的一个重要步骤&#xff0c;它涉及对原始数据进行预处理和修复&#xff0c;以使数据适用于机器学习算法的训练和分析。数据清洗的目标是处理数据中的噪声、缺失值、异常值和不一致性等问题&#xff0c;以提高数据的质量和准确性。 二、方法 处理…

【3D激光SLAM】LOAM源代码解析--scanRegistration.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…

2023-08-21 Unity Shader 开发入门1 —— 渲染管线

文章目录 一、概述二、应用阶段三、几何阶段四、光栅化阶段 一、概述 ​ Unity 中的渲染管线和图形学中的渲染管线基本上指的是相同的概念&#xff0c;但是具体实现和细节方面可能存在一些差异。 ​ Unity 的渲染管线建立在图形学的基础上&#xff0c;但具有自己的实现和拓展。…

ClickHouse安装及部署

文章目录 Docker快速安装Ubuntu预编译安装包安装检查是否支持SSE4.2使用预编译安装包 Tgz安装包配置文件修改修改密码配置远程访问 其他主机访问文章参考 Docker快速安装 本地pull镜像 docker run -d --name ch-server --ulimit nofile262144:262144 -p 9000:9000 -p 8123:81…

stm32的命令规则

stm32型号的说明&#xff1a;以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a;

Python网络爬虫入门到实战

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 网络爬虫&#xff08;We…

记录一个用C#实现的windows计时执行任务的服务

记录一个用C#实现的windows计时执行任务的服务 这个服务实现的功能是每天下午六点统计一次指定路径的文件夹大小 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using Syst…

基于互斥锁的生产者消费者模型

文章目录 生产者消费者 定义代码实现 / 思路完整代码执行逻辑 / 思路 局部具体分析model.ccfunc&#xff08;消费者线程&#xff09; 执行结果 生产者消费者 定义 生产者消费者模型 是一种常用的 并发编程模型 &#xff0c;用于解决多线程或多进程环境下的协作问题。该模型包含…

Go语言基础之切片

切片 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活&#xff0c;支持自动扩容。 切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合 切片的定义…

Redis 整合中 Redisson 的使用

大家好 , 我是苏麟 , 今天带来 Redisson 使用 . 官方文档 : GitHub - redisson/redisson: Redisson - Easy Redis Java client with features of In-Memory Data Grid. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, Sorte…

Alibaba-Easyexcel 使用总结

简介 简介 EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目&#xff0c;在尽可能节约内存的情况下支持读写百 M 的 Excel。 但注意&#xff0c;其不支持&#xff1a; 单个文件的并发写入、读取读取图片宏 常见问题 Excel 术语 Sheet&#xff0c;工作薄…

RNN+LSTM正弦sin信号预测 完整代码数据视频教程

视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示: 数据展示: 完整代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.preprocessing import…

Nginx代理功能与负载均衡详解

序言 Nginx的代理功能与负载均衡功能是最常被用到的&#xff0c;关于nginx的基本语法常识与配置已在上篇文章中有说明&#xff0c;这篇就开门见山&#xff0c;先描述一些关于代理功能的配置&#xff0c;再说明负载均衡详细。 Nginx代理服务的配置说明 1、上一篇中我们在http…

python的安装

1.进入python官网下载安装包&#xff1a;https://www.python.org/ 2.安装 注意&#xff1a;勾选Add Python 3.8 to PATH选项&#xff0c;并且建议选择Install Now选项&#xff0c;东西多。 解释&#xff1a;这里的path是指系统路径&#xff0c;即将python.exe文件添加到系 统…

常见的网络设备有哪些?分别有什么作用?

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络设备的概述 二、常见的网络设备 1、…

JVS低代码中表单引擎与逻辑引擎是如何联合调用外部API的?

在企业项目中&#xff0c;常常出现需要给外部系统提供一个api &#xff0c;让外部系统触发调用&#xff0c;本系统直接数据入库&#xff0c;那么我们来看看jvs的表单引擎与逻辑引擎联合实现这个功能&#xff0c;先看实现效果&#xff1a; 配置步骤&#xff1a; 一、配置列表页…

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到&#xff0c;一定要会172.22.141.231/26&#xff0c;该IP位于哪个网段&#xff1f; 该网段拥有多少可用IP地址&#xff1f;广播地址是多少&#xff1f; 解题思路&#xff1a; 网络地址&#xff1a;172.22.141.192 10101100.00010110.10001101.11000000 广播…

【后端速成 Vue】第一个 Vue 程序

1、为什么要学习 Vue&#xff1f; 为什么使用 Vue? 回想之前&#xff0c;前后端交互的时候&#xff0c;前端收到后端响应的数据&#xff0c;接着将数据渲染到页面上&#xff0c;之前使用的是 JavaScript 或者 基于 JavaScript 的 Jquery&#xff0c;但是这两个用起来还是不太…

uni-app 打包生成签名Sha1

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法&#xff1a; 安装JRE环境&#xff08;推荐使用JRE8环境&am…