MySQL--主从复制和读写分离

news2025/1/12 23:36:23

MySQL主从复制和读写分离相关知识

1.什么是读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) ,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

2.为什么要读写分离?

1.数据库在写入数据的时候比较耗时(10000条数据 大概要4分钟)

2.数据库在读写的时候速度很快(10000条 大概5 秒左右)

读写分离之后,数据的写入和读取是分开的,哪怕写入的数据量比较大,但是不影响查询的效率

3.什么场景下需要读写分离?

数据库不是一定需要读写分离。只是在某些程序在使用数据库过程中,更新少,但是查询较多,这种情况可以考虑读写分离。

生产库一般都会做读写分离。

测试库一般不管。

在工作中,数据库的读写不会在同一个库中完成,这样既不安全,也不能满足高可用,也不能实现高并发。工作中都会做读写分离。

4.主从复制的优点

  • 数据分布:通过复制将数据分布到不同地理位置

  • 负载均衡:读写分离以及将读负载到多台从库

  • 备份:可作为实时备份

  • 高可用性:利用主主复制实现高可用

5. mysql支持的复制类型

(1) STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制(5.7版本之前),执行效率高。高并发的情况可能会出现执行顺序的误差,事务的死锁。

(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一 遍。精确,但效率低,保存的文件会更大。(5.7版本之后默认采用ROW模式)

(3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。更智能,所以大部分情况下使用MIXED。
 

三者区别

1.STATEMENT(基于sql):高并发会导致数据丢失,顺序有误

2.ROW(基于行):精准匹配,但恢复数据时,效率低

3.MIXED:一般情况用sql,高并发自动切换row

6.mysql主从复制的过程

主从复制基于主mysql服务器和从mysql服务器的三个线程两个日志展开进行的:

两个日志:二进制日志(bin log) 、中继日志(Relay log)

三个线程:I/O线程、dump线程、SQL线程

7.主从复制的工作过程:

1、 主节点的数据记录发生变化都会记录在二进制日志

2、 slave节点会在一定时间内对主库的二进制文件进行探测。探测是否发生变化。如果有变化从库会开启一个IO的线程。请求主库的二进制事件。

3、 主库会给每一个I/O的线程启动一个dump线程,用于发送二进制事件给从库。从库通过I/O线程获取跟新,slave_sql负责将更新写入到从库本地,实现主从一致。

8.主从复制的问题:

1、 只能在主库上发生变化,然后同步到从。从库的更新不会同步到主

2、复制的过程是串行化过程,在从库上复制是串行的。主库的并行更新不能在从库上并行操作。

3、 主从复制的设计目的:就是为了在主库上写,在从库上查。读写分离,实现高可用。

MySQL主从复制的模式

1.异步复制:

MySQL的默认复制就算异步复制。只要执行完之后,客户端提交事务,主MySQL会立即把结果返回给服务器,主MySQL并不关心从MySQL是否已经接受,并且处理。

异步:不用等待返回结果(udp )

主一旦崩溃,主MySQL的事务可能没有传到从MySQL,这个时候强行把从提升为主,可能到新的主MySQL数据不完整(很少见)

2.全同步复制,

主库执行完成一个事务,所有的从库都执行了该事务之后才会返回客户端。因为需要等待所有从库全部执行完成,性能必然下降。(对数据一致性,和数据完整要求很好的场景)

3.半同步复制:

介于异步复制和全同步复制之间。主库执行完一个客户端提交的事务之后,至少等待一个从库接受并处理完成之后才会返回给客户端。半同步在一定程度上提高了数据的安全性。也会有一定的延迟。

这个延迟一般是一个tcp/ip的往返时间(从发送到接受的时间,单位是毫秒)。半同步复制最好在电视的网络中使用。

时间<1ms:round-trip-time RTT

如何实现主从复制

mysql 1  主  20.0.0.100
MySQL 2  从  20.0.0.110
MySQL 3  从  20.0.0.10
test1    读写分离的服务器 20.0.0.140
test2    客户端

关闭防火墙
systemctl stop firewalld
setenforce 0

MySQL1
yum -y install ntp
vim /etc/ntp.conf

末
server 127.127.233.0
fudge 127.127.233.0 stratum 8
//数字越小。时间精确度越高。设置fudge 8,时间层级是8,最高为(15),设在中间即可,从本地获取时间源同步,不从网络获取

systemctl restart ntpd
mysql2,3
systemctl restart ntpd

mysql2,3
/usr/sbin/ntodate 192.168.233.21

crontab -e -u root
*/30 * * * *  /usr/sbin/ntpdate 192.168.233.21

date 查看时间


MySQL1
vim /etc/my.cnf

server-id = 1
log-bin=master-bin
//打开二进制日志
binlog_format=MIXED
//处理方式
log_slave-updates=true
//允许从服务器复制数据时,可以从主的二进制日志写到自己的二进制日止当中
wq

systemctl restart mysqld

mysql -uroot -p123456
grant replication slave on *.* to 'mysqlslave'@'20.0.0.%' identified by '123456';

flush privilieges;

show master status;


从库MySQL2
vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
// 设置索引文件
relay_log_recovery=1
//默认是0,1开启中继日志的护肤,从服务器出现异常或者崩溃时

systemctl restart mysqld

mysql3
vim /etc/my.cnf
server-id = 3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1
wq
systemctl restart mysqld


mysql2
mysql -uroot -p123456

CHANGE master to master_host='20.0.0.100',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=599;
//同步

start slave;
show slave status\G;

mysql3
mysql -u root -p 123456

CHANGE master to master_host='20.0.0.100',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=599;
//同步
start slave;



打开终端
MySQL1
create database kgc;

MySQL2,3查看是否有kgc的库

MySQL1
create table test (

);
给表插入数据

Slave_IO_Running:Yes 负责和主库的IO通信

//位置偏移量不对,防火墙没关,配置文件不对

Slave SQL Running:Yes

//负责自己的slave MySQL进程

slave io running no 的原因

1.网络问题

2.my.cnf 配置文件写错了

3.CHANGE master to master_host='192.168.233.21',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604; 文件名写错了,位置偏移量不对

4.防火墙和安全机制的问题

**位置偏移量要和主服务器上  show master status;中内容一致

主从复制延迟的问题

1.网络延迟

2.主从硬件设备(CPU主频,内存I/O,硬件I/O)

3.同步复制而不是异步复制

解决方案:

1.硬件方面:主库一般来说不需要动的太多,从库的硬件配置变更好。提升随机写的性能,硬盘可以考虑缓存固态。升级cpu的核数,扩展一下内存。尽量使用物理机(不要使用云服务器)。四核8G,硬盘

2.网络层面,主从服务器都配置在一个局域网内,尽量避免跨网段,跨机房。

架构方面:做读写分离把写入控制在主库,从库负责读,降低从库的压力

4.配置方面mysql配置,从配置文件的角度实现性能最大化

追求安全性配置:

innodb flush_log_at_trx_commit=1

//每次啊hi去提交时都会刷新事务日志,已确保持久性,最高级别的数据安全性,但是会影响性能,默认是1

0 就是事务提交是不会立即刷新,而是每秒刷新。可以提高性能,但是发送故障会导致数据丢失

2 事务提交时,事务日志不会写入硬盘而是保存在系统缓存,不会进行刷新,一定的安全性和性能,内存要求比较高。

sunc_binlog=1

1 也是默认值,每次提交事务之后,直接把二进制刷新到硬盘,以确保日志的持久性,占用比较高的性能,但是安全

0 二进制日志写入缓存,也不会刷新日志文件。故障发送也会发发

读写分离配置

要实现读写分离,首先必须要实现主从复制。

读写分离:所有的写入操作都在主库,从库只负责读。(select)。如果有更新,是从主库复制到从库。

Mysql读写分离的原理:

1.根据脚本实现。在代码中实现路由分类。select insert进行路由分类。这种方式是最多的。

特点:性能号,在代码中就能实现,不需要额外的硬件设备

缺点:门槛高,开发实现。如果大型的复制的应用,设计改动的代码非常多。

2.基于中间层代理实现

mysql-proxy自带的开源项目。基于自带的lua脚本不是现成的,要自己写,不熟悉他的内置变量是写不出来的 atlas 360内部自己使用的代理工具。每天的读写请求承载量可以到几十亿条,支持事务,支持存储过程

Amoeba 陈思儒,之前在阿里就职。是由java开发的一个开源软件,不支持事务,也不支持存储过程。但是Amoeba也是用的最广

mycat也可以实现

安装部署mycat

(1)主机上安装java(mycat基于java)
#yum安装java
[root@localhost ~]#yum install java -y
#确认安装成功
[root@localhost ~]#java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

(2)切换至opt目录,下载mycat安装包
[root@localhost ~]#cd /opt
[root@localhost ~]#wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz

(3)创建/apps文件夹,并解压mycat包至/apps下
[root@localhost ~]#mkdir /apps
[root@localhost ~]#tar zxvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps/

(4)设置变量环境
[root@localhost ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
[root@localhost ~]#source /etc/profile.d/mycat.sh

(5)启动mycat,查看日志文件,最后可以看到启动成功
[root@localhost ~]#mycat start
#注意内存小于2G 起不来
Starting Mycat-server...

[root@localhost ~]#tail -f /apps/mycat/logs/wrapper.log
#启动成功日志末尾会出现successfully
STATUS | wrapper  | 2021/12/09 21:04:10 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2021/12/09 21:04:10 | Launching a JVM...
INFO   | jvm 1    | 2021/12/09 21:04:11 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2021/12/09 21:04:11 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2021/12/09 21:04:11 | 
INFO   | jvm 1    | 2021/12/09 21:04:12 | MyCAT Server startup successfully. see logs in logs/mycat.log


(6)客户端连接数据库
#这里密码初始为123456   需要加端口
[root@localhost bin]#mysql -uroot -p123456 -h 192.168.59.114 -P8066

修改 mycat 配置文件 /apps/mycat/conf/server.xml

[root@localhost ~]#vim /apps/mycat/conf/server.xml

#去掉44行行注释,对应的在51行行末注释,删除50行行末注释,5 * 60 * 1000L; //连接空>    闲检查

#修改45行端口号为3306
45 <property name="serverPort">3306</property>

#配置Mycat的连接信息(账号密码),在110 和111行, 可以修改,这边不修改了

修改 mycat 配置文件/apps/mycat/conf/schema.xml

[root@localhost ~]#vim  /apps/mycat/conf/schema.xml
#删除所有内容,重新写入以下
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        #schema标签:数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应。
        #name:逻辑数据库名,与server.xml中的schema对应;
        #checkSQLschema: 数据库前缀相关设置,这里为false;
        #sqlMaxLimit:  select时默认的limit,避免查询全表,否则可能会遇到查询量特别大的情况造成卡 死;
        #dataNode:表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
</schema>
        <dataNode name="dn1" dataHost="localhost1" database="hellodb" />
        #dataNode标签: 定义mycat中的数据节点,也是通常说的数据分片,也就是分库相关配置
        #name: 定义数据节点的名字,与table中dataNode对应
        #datahost: 物理数据库名,与datahost中name对应,该属性用于定义该分片属于哪个数据库实例
        #database: 物理数据库中数据库名,该属性用于定义该分片属性哪个具体数据库实例上的具体库
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
        #dataHost标签: 物理数据库,真正存储数据的数据库
        #name: 物理数据库名,与dataNode中dataHost对应
        #maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标  签都会使用这个属性的值来实例化出连接池的最大连接数
        #minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小
        #balance: 均衡负载的方式
       
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                  #writeType: 写入方式
                  #dbType: 数据库类型
                  #dbDriver指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
                  #switchType:  “-1” 表示不自动切换; “1” 默认值,自动切换; “2” 基于 MySQL主从同步的状态决定是否切换心跳语句为 show slave status; “3” 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’.
                <heartbeat>select user()</heartbeat>
                #heartbeat: 心跳检测语句,注意语句结尾的分号要加
                <writeHost host="host1" url="192.168.59.113:3306" user="root" password="123456">
                #host:用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。
                #url:后端实例连接地址。Native:地址:端口 JDBC:jdbc的url
                #user:后端存储实例需要的用户名字
                #password:后端存储实例需要的密码
                 <readHost host="host2" url="192.168.59.112:3306" user="root" password="123456"/>

                </writeHost>
        </dataHost>
</mycat:schema>

<dataNode name="主服务器的主机名">

<database="指定主服务器的数据库名">

<writeHost host="host1" url="主服务器的IP">

<readHost host="host1" url="从服务器的IP">

主服务器上授权

[root@localhost ~]#mysql -uroot -p123123
#授权
GRANT ALL ON *.* TO 'root'@'192.168.59.%' IDENTIFIED BY '123456';
flush privileges;


#查看创建成功
use mysql;
select user,host from user;

GRANT ALL ON *.* TO 'root'@'192.168.59.%' IDENTIFIED BY '123456';

flush privileges;

此处一定要刷新权限,否则接下来配置无法成功启动!!!!

重启mycat服务,客户机连接mycat

在mycat服务器上,重启mycat服务,查看启动日志,文末出现successfully
 [root@localhost ~]#mycat restart  
 [root@localhost ~]#tail -f /apps/mycat/logs/wrapper.log



 INFO   | jvm 1    | 2021/12/09 21:15:40 | 
INFO   | jvm 1    | 2021/12/09 21:15:40 | MyCAT Server startup successfully. see logs in logs/mycat.log
STATUS | wrapper  | 2021/12/09 21:16:38 | TERM trapped.  Shutting down.
STATUS | wrapper  | 2021/12/09 21:16:39 | <-- Wrapper Stopped
STATUS | wrapper  | 2021/12/09 21:16:40 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2021/12/09 21:16:40 | Launching a JVM...
INFO   | jvm 1    | 2021/12/09 21:16:40 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2021/12/09 21:16:40 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2021/12/09 21:16:40 | 
INFO   | jvm 1    | 2021/12/09 21:16:41 | MyCAT Server startup successfully. see logs in logs/mycat.l

查看3306端口,可以监听到主从服务器

ss -antp|grep 3306

此处必须得是 user:(("java".......))

才算成功。同时,如果本机有mysql,一定得关闭mysql服务,否则会因为端口被占从而服务搭建失败

在客户机上登录mycat,这时可以不加端口直接进入数据库了

如何实现完全同步

完全同步其实就是主主同步。

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

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

相关文章

【unity】网格描边方法

【unity】网格描边方法 介绍对模型四边网格的三种描边方法&#xff1a;包括纯Shader方法、创建网格方法和后处理方法。于增强场景中3D模型的轮廓&#xff0c;使其在视觉上更加突出和清晰。这种效果可以用于增强三维场景中的物体、角色或环境&#xff0c;使其在视觉上更加吸引人…

wordcloud出现ValueError: Only supported for TrueType fonts

方法1&#xff1a;换一个版本的wordcloud即可&#xff0c;实测windows在1.8.2.2版本上不会报错。 方法2&#xff1a;还可以尝试其他博客中的解决方案&#xff0c;自己下个字体的TTF文件&#xff0c;让后font_path直接写字体文件路径。&#xff08;此方法未见效&#xff09;

11月14日星期二今日早报简报微语报早读

11月14日星期二&#xff0c;农历十月初二&#xff0c;早报微语早读。 1、江西南城县&#xff1a;限时发放购房补贴政策&#xff0c;三孩家庭每平方米最高补贴500元&#xff1b; 2、2023年中国内地电影市场累计票房突破500亿元&#xff1b; 3、市场监管总局&#xff1a;在全国…

21.计算老师的工资

&#xff08;定义结构体数组存放教师的财务信息&#xff08;教工卡号&#xff0c;应发工资&#xff0c;个人所得税&#xff0c;实发工资&#xff09;具体要求如下从键盘输入5个教师的教工卡号&#xff0c;应发工资 计算每人的个人所得税&#xff08;应发工资10%&#xff09;&am…

好心提醒下,幼师姐妹们要知道啊

幼师家人们在不在&#xff1f;在不在&#xff1f; 不会还有姐妹在自己写教案&#xff0c;写总结&#xff0c;写评语啥的吧&#xff0c;这个好东西真的要知道啊&#xff01;&#xff01; 只要输入关键词&#xff0c;马上就能得到你想要的内容&#xff0c;真的很强啊&#xff0…

设计模式系列之最终篇:大盘点

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概4000多字&#xff0c;预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

NVMe 2.0 简介

随着全新一代PCIe 5.0 SSD的发布&#xff0c;新的NVMe 2.0规范协议也是如期而至。作为PCIe SSD最为重要的底层协议&#xff0c;NVMe 2.0都有哪些重要调整&#xff1f;又有哪些值得我们关注的新功能&#xff1f;本文简单解答。 NVMe 演化史 NVMe自诞生以来&#xff0c;其关注的…

Blazor 附件上传和下载功能

效果图 page "/uploadFile" inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment inject ToastService ToastService inject DownloadService DownloadService<h3>UploadFile</h3><Button OnClick"ButtonClick" C…

cmd窗口中文乱码

问题&#xff1a;今天电脑重装了&#xff0c;跑程序的时候&#xff0c;cmd窗口汉字出现乱码&#xff0c;看起来很不舒服 解决方案&#xff1a;在注册表中修改cmd的属性设置&#xff0c;实现一次修改永远有效 1. 打开 winR 输入 regedit 进入注册表 2. 找到 HKEY_CURRENT_USER…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):FREERTOS移植

前言: 一般的GUI工程都需要一个操作系统,可能是linux,重量级的,也可能是FreeRTOS,轻量级的。 一句话理解那就是工程就是FreeRTOS task任务的集合。 一个main函数可以看到大框架: 很显然,除了第一个是硬件配置的初始化,中间最重要的部分就是要创建任务。而一个任务主…

STM32H750之FreeRTOS学习--------(六)FreeRTOS的列表和列表项

六、FreeRTOS的列表和列表项 文章目录 六、FreeRTOS的列表和列表项列表相关结构体列表项相关结构体迷你列表项列表相关API函数介绍初始化列表vListInitialise()函数vListInitialiseItem()函数vListInsert()函数 vListInsertEnd()函数 uxListRemove() 列表就是一个双向链表&…

RT-DETR算法优化改进:Backbone改进 | LSKNet:遥感旋转目标检测新SOTA | ICCV 2023

💡💡💡本文独家改进:LSKNet 助力RT-DETR ,替换backbone,Large Selective Kernel Network (LSKNet),可以动态地调整其大空间感受野,以更好地建模遥感场景中各种物体的测距的场景。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/cat…

Windows装机必装软件|每款都好用到起飞!

1.GeekUninstaller&#xff1a;这款软件是一款功能强大的卸载工具&#xff0c;可以完全删除无用的程序和插件&#xff0c;并清理与之相关的文件夹。它没有广告或捆绑软件&#xff0c;非常干净。 2.PotPlayer&#xff1a;作为一款纯粹的播放器&#xff0c;PotPlayer可以流畅播放…

【数据结构】面试OJ题——带环链表(数学推论)

目录 1.环形链表Ⅰ ​编辑 思路 &#xff1a; 思路拓展 问题一&#xff1a; 问题二&#xff1a; 总结&#xff1a; 问题三&#xff1a; 证明总结第三点 总结&#xff1a; 2. 环形链表Ⅱ 思路一 思路二 3.相交链表 思路&#xff1a; 1.环形链表Ⅰ 141. 环形链…

ebSocket connection to ‘wss://xxx.xxxxxxx.xxx/‘ failed:

目录 1&#xff1a;网络连接问题&#xff1a;检查您是否已连接到互联网&#xff0c;您的网络是否稳定。您还可以尝试重置您的Internet连接或切换到另一个网络。 排除方法&#xff1a;直接打开个网址就知道了&#xff0c;这应该不用教了吧 2&#xff1a;防火墙或代理设置&…

桌面便签软件用哪个?10款全球好用的便签软件推荐,告别杂论无章!

在如今的快节奏社会中&#xff0c;我们的生活和工作节奏越来越快&#xff0c;每天面对的信息成倍地增长。有时候&#xff0c;我们需要随手记下一些重要的事情&#xff0c;或者是一些突然的灵感&#xff0c;这时候就需要一款好用的桌面便签软件。 桌面便签软件可以帮助我们更好…

【机器学习5】无监督学习聚类

相比于监督学习&#xff0c; 非监督学习的输入数据没有标签信息&#xff0c; 需要通过算法模型来挖掘数据内在的结构和模式。 非监督学习主要包含两大类学习方法&#xff1a; 数据聚类和特征变量关联。 1 K均值聚类及优化及改进模型 1.1 K-means 聚类是在事先并不知道任何样…

为什么说美味、珍贵的高贵甜酒是“来自大自然的礼物”?

当德国葡萄酒产区的主要葡萄收获季节成功结束时&#xff0c;人们可以观察到在某些地区个别葡萄园还没有收获。它们没有被酿酒师遗忘&#xff0c;而是在等待成为高贵甜美的佳肴。在秋天的好天气里&#xff0c;葡萄继续生长&#xff0c;每天自然都会增加它们的甜度。来自云仓酒庄…

负公差轧钢测径仪 多规格可定制 普通智能随意选择

负公差轧制的意义&#xff1a; 轧钢厂生产的螺纹钢是按理论重量销&#xff0c;因此稳定的高负差产品极具市场竞争力。负差率即实际重量与理论重量的差值&#xff0c;除以理论重量&#xff0c;乘100%。以螺纹12为例&#xff0c;不按负差生产&#xff0c;在坯重2450kg的情况下&am…

React Hooks实战:Web开发与设计

目录 前言 一、React Hooks 简介 二、React Hooks 的基本用法 1. 使用 useState 创建状态 2. 使用 useEffect 添加副作用 3. 使用 useContext 获取上下文 三、React Hooks 的常见问题 1. 循环引用问题 2. 副作用问题 四、React Hooks 实战案例 1. 使用 useState钩子…