MySQL主从复制及读写分离(三十四)

 

目录

MySQL主从复制

一、概述

1、MySQL Replication优点:

二、MySQL复制类型

1、异步复制(Asynchronous repication)

2、全同步复制(Fully synchronous replication)

3、半同步复制(Semisynchronous replication)

三、MySQL支持的复制方式

1、基于SQL语句的复制

2、基于行的复制

3、混合模式复制

四、MySQL复制的工作过程

五、复制过程的限制

六、部署MySQL主从异步复制

1、配置mysql master服务器

2、创建Replication用户

3、 获得Master DB的相关信息

4、备份Master原有数据

5、在MySQL Slave上的配置 

6、测试复制是否成功 

基于Amoeba读写分离

七、概述

1、主从复制

2、数据同步

3、读写分离规则

八、常见的MySQL读写分离

1、基于程序代码内部实现

2、基于中间代理层实现

九、实验

1、在主机Amoeba上安装java环境

2、安装并配置amoeba,赋予权限

3、配置Amoeba读写分离,两个Slave读负载均衡

3.1、配置无误后,启动Amoeba软件,默认端口是TCP协议8066

3.2、在Client上进行访问测试 

3.3、测试写操作:

总结


MySQL主从复制

一、概述

       MySQL Replication俗称MySQL AB复制、主从复制、主从同步,是MySQL官方推荐的数据同步技术。数据同步基本过程为从数据库会实时去读取主数据库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到数据同步效果。

1、MySQL Replication优点:

       通过增加从服务器来提高数据库平台的可靠性。在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器地数量,从而调整数据库平台地高性能。

       提高数据安全性,因为数据已复制到从服务器,主数据库异常时,可以将从服务器复制进程终止来达到保护数据完整性地特点。

       在主服务器上生成实时数据,而在从服务器上分析这些数据,从而缓解主服务器地性能压力。

二、MySQL复制类型

1、异步复制(Asynchronous repication)

       MySQL默认地复制是异步地,主库在执行完客户端提交地事务后会立刻将结果返回给客户端,并不关心从库是否已经接受并处理了事务,这样就会有一个问题,主库如果down掉了,此时主上已经提交地事务可能没有传到从库服务器上,如果此时,强制将从提升为主,可能会导致新主上的数据不完整。默认情况下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的复制功能是异步的。

2、全同步复制(Fully synchronous replication)

       指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响,返回客户端的响应速度也会被拖慢。

3、半同步复制(Semisynchronous replication)

        MySQL由Google贡献的补丁才开始支持半同步复制模式,介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接受到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。

        半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式

三、MySQL支持的复制方式

1、基于SQL语句的复制

       在主服务器上执行的SQL语句,在从服务器上执行同样的SQL语句,效率比较高。

2、基于行的复制

       主服务器把表的行变化作为事件写入到二进制日志中,主服务器把代表了行变化的事件复制到从服务器中。

3、混合模式复制

       先采用基于语句的复制,一旦发现基于语句无法精确复制时,再采用行。

四、MySQL复制的工作过程

1、在每个事务更新完成数据之前,Master会在二进制日志中记录这些数据的语句,当MySQL将事务串行的写入二进制日志完成后,Master通知存储引擎提交事务并将数据写入磁盘

2、Slave开启一个I/O工作线程,在Master之间建立一个连接,然后开始Binlog dump process,Binlog dump process会从Master的二进制日志中读取操作事件,如果已经跟Master达到一致状态,它会催眠并等待Master产生新的操作事件,I/O线程将这些改变数据的事件写入自己的中继日志。

3、SQL Slave Thread(SQL工作线程)是处理MySQL Replication过程的最后一步。SQL线程从中继日志读取操作事件,重放其中的事件从而更新Slave服务器的数据,使slave与Master中的数据保持一致,只要该线程与I/O线程保持一致,中继日志通常会在OS的缓存中,所以中继日志的开销很小。

五、复制过程的限制

1、MySQL5.6之前的版本复制操作在slave上执行的是串行化的,也就是Master上的并行更新会导致数据复制延迟

2、所有MySQL服务器的版本都要高于3.2,还有一个基本的原则就是从服务器的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本

六、部署MySQL主从异步复制

在所有机器上安装mysql或mariadb

 yum install -y mariadb mariadb-devel mariadb-server

1、配置mysql master服务器

在/etc/my.cnf中修改或者增加如下内容:

vim /etc/my.cnf

 添加内容如下:

server-id=1
log-bin=mysql-binlog
log-slave-updates=true

 

 重启mysql服务器

systemctl restart mariadb

查看监听

netstat -anptu | grep 3306

2、创建Replication用户

grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123123.coM';

Replication slave:用于复制性从属服务器(从主服务器中读取二进制日志文件权限)

        这条命令是MySQL中的授权语句,用于给用户 'myslave' 授予在任何数据库和任何表上进行复制操作的权限,并使用密码 '123123.coM' 进行身份验证。该用户是通过 IP 地址范围为 '192.168.1.%' 的连接进行授权的,这意味着只有以该 IP 地址开头的客户端才能使用这个用户进行复制操作。

注:创建完成记得刷新配置 

flush privileges;

3、 获得Master DB的相关信息

show master status;

供slave连接使用,记录下File和Position的值。 

4、备份Master原有数据

       如果在生产环境中Master服务器已经运行一段时间,或者Master服务器上已经存在数据,为了保证所有数据的一致性,需要先将Master目前已有的数据全部导给Slave服务器。

       备份的方法有很多,可以直接备份数据文件,也可以使用mysqldump工具。全新搭建的环境不存在数据备份问题。

mysqldump -uroot -p --all-databases > /root/alldbbackup.sql

将备份的数据传输给从服务器

scp /root/alldbbackup.sql root@192.168.1.101:/root/
scp /root/alldbbackup.sql root@192.168.1.102:/root/

5、在MySQL Slave上的配置 

导入Master的备份脚本(刚刚传输的)

systemctl start mysqldmysql -uroot -p < /root/alldbbackup.sql

从库连接主库进行测试,如果连接成功说明主库配置成功

mysql -u myslave -p123123.coM -h 192.168.1.100

 修改MySQL从服务器配置文件

vim /etc/my.cnf
server-id=2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

配置多个从服务器时依次设置server-id号 

 

 重启服务

systemctl restart mariadb

在Slave服务器授权,启动从库,进行主从库数据同步 

stop slave;
CHANGE MASTER TO MASTER_HOST='192.168.1.100',MASTER_USER='myslave',MASTER_PASSWORD='123123.coM',MASTER_LOG_FILE='mysql-binlog.000001',MASTER_LOG_POS=479;

 这是MySQL中用于配置从服务器的语句,用于指定主服务器的相关信息,以便从服务器可以连接到主服务器并开始复制数据。命令含义如下:

- `CHANGE MASTER TO`: 告诉MySQL服务器要更改从服务器的配置。

- `MASTER_HOST='192.168.1.100'`: 指定主服务器的IP地址或主机名为 '192.168.1.100',表示从服务器将连接到该主服务器。

- `MASTER_USER='myslave'`: 指定从服务器连接主服务器时要使用的用户名为 'myslave',这是在前面的授权命令中创建的用户。

- `MASTER_PASSWORD='123123.coM'`: 指定从服务器连接主服务器时使用的密码为 '123123.coM',这是在前面的授权命令中设置的密码。

- `MASTER_LOG_FILE='mysql-binlog.000001'`: 指定从服务器开始复制的主服务器二进制日志文件名,此处为 'mysql-binlog.000001'。这表示从该文件开始复制数据。

- `MASTER_LOG_POS=479`: 指定从服务器复制的主服务器二进制日志文件的位置,此处为 479。这表示从该位置开始复制数据。

此命令的目的是配置从服务器连接到指定的主服务器,并从指定的二进制日志文件和位置开始复制数据。

如果出现问题

1.使用 find / -iname "auto.cnf" 命令查找你数据库的auto.cnf 配置文件。

find / -iname "auto.cnf"

2.把查询到的文件删除,系统将重新自动分配

rm -rf 查询到的文件目录

3.登录mysql,重启slave,再次验证

stop slave;
start slave;
show slave status\G;

如果还未成功( Slave_I0_Runing:NO )一般是事务回滚造成的:

stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;

 这是MySQL中的一个命令,用于跳过从服务器上的一个事务并继续执行后续的事务。具体来说,该命令的含义是:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1: 设置全局变量 SQL_SLAVE_SKIP_COUNTER 的值为 1。该变量用于指定从服务器跳过的事务数量。

这个命令通常在从服务器上执行,用于处理复制过程中的错误或跳过某些无法执行的事务。通过将 SQL_SLAVE_SKIP_COUNTER 设置为一个正整数,可以告诉从服务器跳过指定数量的事务,并继续执行后续的事务。

start slave;
flush privileges;

 查看

 参数说明:

CHANGE MASTER TO

MASTER_HOST='master_host_name', #主服务器的IP地址

MASTER_USER='replication_user_name', #主服务器授权的用户

MASTER_PASSWORD='replication_password', #主服务器授权的密码

MASTER_LOG_FILE='recorded_log_file_name', #主服务器二进制日志的文件名

MASTER_LOG_POS=recorded_log_position; #日志文件的开始位置

6、测试复制是否成功 

       在Master服务器上创建一个数据库或者表,到Slave服务器上查看,如果配置成功就可以成功同步。

 主服务器创建数据库

mysql -uroot -p123123
create database a2; 

从服务器登录查看数据库列表  

mysql -u myslave -p123123.coM -h 192.168.1.100
show databases;

 

可以查询到,说明主从数据库创建成功。 主从服务器可以进行通联。


报以下错误的解决方法:

数据不同步解决方法:


 

基于Amoeba读写分离

七、概述

       在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是安全性,高可用还是并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提供数据的高并发负载能力这样的方案来进行部署。

       简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。

1、主从复制

       通过主从复制技术,将数据库的写操作(insert、update、delete)全部集中在主服务器上,然后将主服务器的写操作日志传输到从服务器上进行执行,以保持从服务器的数据与主服务器一致。主服务器负责处理写操作,从服务器负责处理读操作。

2、数据同步

       主从服务器之间需要保持数据的一致性。当主服务器上的数据发生变化时,会将变更日志传输给从服务器,从服务器通过执行变更日志来同步数据。

3、读写分离规则

       应用程序通过对数据库连接的配置,将读操作的请求发送到从服务器,将写操作的请求发送到主服务器。这样可以实现读操作的负载均衡和写操作的集中处理。

八、常见的MySQL读写分离

1、基于程序代码内部实现

       在代码中根据select,insert进行路由分类,这类方法也是目前大型生产环境应用最广泛的,优点是性能最好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手

2、基于中间代理层实现

       代理一般位于客户端和数据库服务器之间,代理服务器接到客户端请求后通过判断转发到后端数据库,代表性程序:

       (1)mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。

       (2)Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。

        Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。

九、实验

在配置读写分离前配置各机器ip

MySQL Master IP:192.168.1.100

MySQL Slave1 IP:192.168.1.101

MySQL Slave2 IP:192.168.1.102

MySQL Amoeba IP:192.168.1.103

MySQL Client IP:192.168.1.104

1、在主机Amoeba上安装java环境

JAVA官网下载地址:Java 归档下载 - Java SE 6 |甲骨文中国 (oracle.com)

Amoeba(变形虫)下载地址:阿米巴 - 浏览 SourceForge.net 的文件

因为Amoeba是基于jdk1.5版本开发的,所以官方推荐使用1.5或者1.6版本,高版本不建议使用。

查看Java版本 

java -version

 查看路径

which java

 删除查找出来的Java目录

rm -rf /usr/bin/java

下载Java二进制包并按照提示安装Java环境包

 ./jdk-6u14-linux-x64.bin 

 移动目录,赋予执行权限

mv jdk1.6.0_14/ /usr/local/jdk1.6chmod +x /usr/local/jdk1.6/

 

2、安装并配置amoeba,赋予权限

mkdir /usr/local/amoebatar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/chmod -R 755 /usr/local/amoeba/

  设置环境变量java、amoeba

使配置文件生效

source /etc/profile

 检查java版本

java -version

检查环境变量

echo $PATH

3、配置Amoeba读写分离,两个Slave读负载均衡

在Master、Slave1、Slave2服务器中配置Amoeba的访问授权

grant all on *.* to 'test'@'192.168.1.%' identified by '123123.coM';flush privileges;

编辑amoeba.xml配置文件 

 vim /usr/local/amoeba/conf/amoeba.xml
需要更改的内容,仅供参考!30                 <property name="user">amoeba</property>31 32                 <property name="password">123123.coM</property>115                 <property name="defaultPool">master</property>
116                 <property name="writePool">master</property>
117                 <property name="readPool">slaves</property>

 

 编辑dbServers.xml配置文件

vim /usr/local/amoeba/conf/dbServers.xml
需要更改的内容,仅供参考!21 22                         <!-- mysql schema -->23                         <property name="schema">test</property>24 25                         <!-- mysql user -->26                         <property name="user">root</property>27 28                         <!--  mysql password -->29                         <property name="password">123123.coM</property>46                 <factoryConfig>47                         <!-- mysql ip -->48                         <property name="ipAddress">192.168.1.100</property>49                 </factoryConfig>50         </dbServer>51 52         <dbServer name="slave1"  parent="abstractServer">53                 <factoryConfig>54                         <!-- mysql ip -->55                         <property name="ipAddress">192.168.1.101</property>56                 </factoryConfig>57         </dbServer>58 59         <dbServer name="slave2"  parent="abstractServer">60                 <factoryConfig>61                         <!-- mysql ip -->62                         <property name="ipAddress">192.168.1.102</property>63                 </factoryConfig>64         </dbServer>66                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">67                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->68                         <property name="loadbalance">1</property>69 70                         <!-- Separated by commas,such as: server1,server2,server1 -->71                         <property name="poolNames">slave1,slave2</property>72                 </poolConfig>73         </dbServer>

 

 

3.1、配置无误后,启动Amoeba软件,默认端口是TCP协议8066

/usr/local/amoeba/bin/amoeba start &

netstat -anptu | grep 8066

netstat -anpt | grep 3306

3.2、在Client上进行访问测试 

mysql -uamoeba -p123123.coM -h 192.168.1.103 -P 8066

 在MySQL主服务器上创建一个表,会自动同步到各个从服务器上,然后关掉各个服务器上的Slave功能,在分别插入语句测试。

在主服务器上插入内容

insert into a1 values(1,'zn');

从两台从服务器查看 

select * from a1;

查询得知已有数据库,数据表,关闭从服务器服务

  从服务器1      

 从服务器2     

  从客户端查看

select * from a1;

3.3、测试写操作:

在从服务器1上插入一条语句:

insert into a1 values(2,'zm');

 客户端检查验证

 在从服务器2上插入一条语句:

insert into a1 values(3,'zm');

客户端检查验证

 

上述操作对应的是MySQL数据库中的负载均衡

 在客户端插入内容

insert into a1 values(4,'za');

 客户端查看验证

 经过查询,并未发现编号为4的数据

主服务器端进行查看验证

select * from a1;

 

 此类操作对应的正是MySQL数据库中的读写分离

总结

在本次实验中有几个需要注意的地方:

1.在配置amoeba(变形虫)是要注意我们的Java版本是否符合,然后就是安装amoeba,不论是哪个都需要注意路径,在两者操作结束后修改配置文件/etc/profile然后输入source /etc/profile使配置文件生效。

2.然后我们注意要去每个主从服务器里为amoeba用户进行授权,不然无法进行访问

3.测试阶段可以通过slave功能的启停来理解什么事读写分离、负载均衡。
 

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

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

相关文章

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么&#xff1f; 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。…

【shell】获取ping的时延数据并分析网络情况

网络情况经常让我们头疼&#xff0c;每次都需要手动在终端ping太麻烦了&#xff0c;不如写个脚本ping并将数据带上时间戳存入文件&#xff0c;然后也可以分析哪个时间段网络比较差。 创建一个demo.sh文件&#xff1a; #!/bin/bash # 清理日志 net_path"./network/"…

STM32 USB使用记录:HID类设备(后篇)

文章目录 目的基础说明项目构建与代码调整接收发送代码与测试示例链接报告描述符总结 目的 接上篇&#xff1a; 《STM32 USB使用记录&#xff1a;HID类设备&#xff08;前篇&#xff09;》 USB HID 类的设备有个比较大的好处是大部分时候接入主机中都是可以免驱使用的。这篇文…

高并发架构去重难?架构必备技能 - 布隆过滤器

系列文章目录 当Dubbo遇到高并发&#xff1a;探究流量控制解决方案 主从选举机制&#xff0c;架构高可用性的不二选择 高并发架构去重难&#xff1f;架构必备技能 - 布隆过滤器 系列文章目录前言一、布隆过滤器简介二、特性与应用场景三、参数定制四、java版本的Demo五、总结 …

<findbugs>静态代码分析工具

背景&#xff1a; IDEA安装的findbug插件目前无法和jenkins的扫描结果保持一致&#xff0c;因为&#xff1a;没有对应jenkins上findbug的版本&#xff1b; 原理&#xff1a; 将jenkins服务器上的findbugs插件&#xff0c;拷贝到本地&#xff0c;修改build.xml内容以匹配目录…

Resnet与Pytorch花图像分类

1、介绍 1.1数据集介绍 flower_data├── train│ └── 1-102&#xff08;102个文件夹&#xff09;│ └── XXX.jpg&#xff08;每个文件夹含若干张图像&#xff09;├── valid│ └── 1-102&#xff08;102个文件夹&#xff09;└── ─── └── XXX.jp…

Python读取csv、Excel文件生成图表

简介 本文章介绍了通过读取 csv 或 Excel 文件内容&#xff0c;将其转换为折线图或柱状图的方法&#xff0c;并写入 html 文件中。 目录 1. 读取CSV文件 1.1. 生成折线图 1.1.1. 简单生成图表 1.1.2. 设置折线图格式 1.2. 生成柱状图 1.2.1. 简单生成图表 1.2.2. 设置柱…

关于阿里云OSS服务器绑定域名及Https证书

这是一个没有套路的前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 关于阿里云…

零基础玩转C语言—结构体【初阶】

大家好&#xff0c;我是深鱼~ 目录 【前言】&#xff1a; 一、结构体的声明 1.1结构的基本知识 1.2结构的声明 1.3结构体成员的类型 1.4结构体变量的定义和初始化 二、结构体成员的访问 【前言】&#xff1a;本章来介绍结构体的部分知识&#xff0c;并不会深入讲解&…

NOSQL之Redis配置及优化

目录 一、关系型数据库 二、非关系型数据库 三、关系型数据库和非关系型数据库区别 1、数据存储方式不同 2、扩展方式不同 3、对事务性的支持不同 四、Redis简介 五、Redis优点 &#xff08;1&#xff09;具有极高的数据读写速度 &#xff08;2&#xff09;支持丰富的…

基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

C 语言 - 存储类说明符

【预备知识】 1&#xff09;C 语言 - 存储时期 2&#xff09;C 语言 - 链接属性 3&#xff09;C 语言 - 作用域 1. 分类&#xff1a; C 语言为变量提供了 5 中不同的存储模型&#xff08;即存储类&#xff09;。 &#xff08;此外还有基于指针的第 6 种存储模型&#xff0c…

html实现蜂窝菜单

效果图 CSS样式 keyframes _fade-in_mkmxd_1 {0% {filter: blur(20px);opacity: 0}to {filter: none;opacity: 1} } keyframes _drop-in_mkmxd_1 {0% {transform: var(--transform) translateY(-100px) translateZ(400px)}to {transform: var(--transform)} } ._examples_mkmx…

uniapp小程序,根据小程序的环境版本,控制的显页面功能按钮的示隐藏

需求&#xff1a;根据小程序环境控制控制页面某个功能按钮的显示隐藏&#xff1b; 下面是官方文档和功能实现的相关代码&#xff1a; 实现上面需要&#xff0c;用到了uni.getAccountInfoSync()&#xff1a; uni.getAccountInfoSync() 是一个 Uniapp 提供的同步方法&#xff0c…

rsync远程同步

文章目录 一.rsync简介1.一款快速增量备份工具2.rsync应用场景2.1 rsyncinotify的应用场景2.2 rsynccron的应用场景 二.配置rsync备份源&#xff08;同步方式&#xff09;1.rsync同步源2.同步方式3.备份的方式 三.常用rsync命令1.基本格式2.常用选项3.配置源的两种表达 四.配置…

Android 面试题 内存泄露的原因 二

&#x1f525; 什么是内存泄漏 &#x1f525; 在Android开发过程中&#xff0c;当一个对象已经不需要再使用了&#xff0c;本该被回收时&#xff0c;而另个正在使用的对象持有它引用从而导致它不能被回收&#xff0c;这就导致本该被回收的对象不能被回收而停留在堆内存中&#…

SQL-每日一题【626.换座位】

题目 表: Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数&#xff0c;则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 前置知识 MySQL 的 MOD() 函数是取模运算的函数&#xff0c;它返回两个数相除…

【自用记录】常见的第三方接口加密签名方式(ASCll码字典序、URL键值对、 SHA-256加密、MD5加密)

案例1: 案例2: 以上第三方接口都用类似的加密签名方式,两者有类似的部分: 方案1的: $kdata = array(parkId=>$parkId,ts => $ts,serviceCode=>getParkingPaymentList,reqId => $reqId,plateNo => $car_code,//车牌 可为空pageIndex => 1,//第几页page…

无涯教程-jQuery - innerHeight( )方法函数

innerHeight()方法获取第一个匹配元素的内部高度(不包括边框&#xff0c;包括填充)。 innerHeight( ) - 语法 selector.innerHeight( ) innerHeight( ) - 示例 以下是一个简单的示例&#xff0c;简单说明了此方法的用法- <html><head><title>The jQuery…

适合做笔记的软件有哪些?8款好用强大的笔记软件推荐!

除了Goodnotes和Notability&#xff0c;你还知道哪些值得推荐的免费笔记软件吗&#xff1f;本文结合自己的使用经验&#xff0c;推荐笔记软件的同时&#xff0c;亦推荐一些不错的绘图软件供大家选择使用。 1.OneNote 基本的笔记功能都有&#xff0c;加粗、倾斜、下划线、突…