MySQL—Keepalived+MySQL双主复制实现MySQL高可用

Keepalived原理:

Keepalived 的原理主要基于虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)、健康检查机制和负载均衡机制,以下为你详细介绍:

  1. VRRP 协议实现高可用:VRRP 是 Keepalived 实现高可用性的核心协议。在一个 VRRP 组中,有多台运行 Keepalived 的服务器,其中一台被选举为主(Master)服务器,其他的作为备(Backup)服务器。
    • 选举机制:通过比较设备的优先级(Priority)来确定 Master 。优先级取值范围是 1 到 254,数值越大优先级越高。默认情况下,优先级最高的设备会成为 Master 。当优先级相同时,IP 地址较大的设备会成为 Master 。Master 服务器承担实际的网络流量转发任务,而 Backup 服务器则处于监听状态。
    • 心跳检测:Master 服务器会定期(默认每隔 1 秒)向 Backup 服务器发送 VRRP 通告报文,以告知 Backup 自己的存活状态。Backup 服务器接收到通告报文后,会重置定时器。如果 Backup 服务器在一定时间(通常是几个通告间隔时间)内没有收到 Master 发送的通告报文,就会认为 Master 服务器出现故障,然后 Backup 服务器中优先级最高的设备会升级为 Master ,接管原来 Master 的工作,继续处理网络流量。
    • 状态切换:当原来的 Master 服务器恢复正常后,它会重新参与选举。如果其优先级高于当前的 Master 服务器,那么它会重新成为 Master ,而原来的 Master 则切换回 Backup 状态。
  2. 健康检查机制:Keepalived 可以对服务器的服务状态进行健康检查,以确保提供服务的服务器是正常运行的。
    • 常见检查方式:包括 TCP 端口检查、HTTP 检查、脚本检查等。例如,对于 Web 服务器,可以通过 HTTP 检查方式,向服务器的 Web 端口发送请求,根据服务器的响应来判断服务器是否正常。如果服务器没有响应或者响应状态码不符合预期,Keepalived 就会认为该服务器出现故障,将其从服务池中移除,不再将流量转发到该服务器。
    • 动态调整:通过健康检查,Keepalived 可以实时监测服务器的状态,并根据服务器的状态动态调整负载均衡的策略,保证服务的可用性和稳定性。
  3. 负载均衡机制(结合 LVS 时):Keepalived 常与 Linux 虚拟服务器(LVS)结合使用,实现负载均衡功能。
    • LVS 原理:LVS 是基于 Linux 内核的一种高性能负载均衡技术,它工作在网络层(OSI 模型的第三层),可以根据不同的调度算法(如轮询、加权轮询、最少连接等)将客户端的请求转发到后端的多个真实服务器上。
    • 协同工作:Keepalived 可以管理 LVS 的配置,监控后端真实服务器的状态。当发现某台真实服务器出现故障时,Keepalived 会自动调整 LVS 的配置,将该服务器从负载均衡的服务器池中移除,避免将请求转发到故障服务器上,从而保证服务的连续性和可用性。

综上所述,Keepalived 通过 VRRP 协议实现高可用性,通过健康检查机制确保服务器的正常运行,通过与 LVS 结合实现负载均衡,为网络服务提供了可靠的保障。

MySQL双主复制原理:

MySQL 主主复制(也称为双主复制)是一种特殊的复制模式,两台 MySQL 服务器都可以作为主服务器,同时接受写入操作,并将各自的更改复制到对方,实现双向的数据同步。其原理主要涉及以下几个关键部分:

  1. 二进制日志(Binary Log):每台 MySQL 服务器都启用二进制日志功能,用于记录所有对数据库进行修改的操作,如 INSERT、UPDATE、DELETE 等。二进制日志以事件的形式存储,包含了操作的具体内容和相关信息。例如,当在主服务器 A 上执行一个 INSERT 语句插入一条新记录时,该操作会被记录到主服务器 A 的二进制日志中。
  2. I/O 线程:在主主复制中,每台服务器都有一个 I/O 线程。当一台服务器(假设为服务器 A)上有数据更改并记录到二进制日志后,另一台服务器(服务器 B)的 I/O 线程会连接到服务器 A,请求读取服务器 A 的二进制日志。I/O 线程将读取到的二进制日志事件记录到本地的中继日志(Relay Log)中。例如,服务器 B 的 I/O 线程会定期检查服务器 A 的二进制日志是否有更新,如果有更新则读取并写入到自己的中继日志中。
  3. 中继日志(Relay Log):中继日志用于存储从主服务器复制过来的二进制日志事件。服务器 B 的 I/O 线程将从服务器 A 读取的二进制日志事件写入中继日志后,由服务器 B 的 SQL 线程来处理这些事件。
  4. SQL 线程:每台服务器的 SQL 线程负责读取中继日志中的事件,并在本地数据库上执行这些事件,从而实现数据的同步。例如,服务器 B 的 SQL 线程读取中继日志中来自服务器 A 的 INSERT 操作事件,并在服务器 B 的数据库中执行相同的 INSERT 操作,插入相同的记录。
  5. 设置唯一标识:为了避免循环复制(即一台服务器将另一台服务器复制过来的数据又复制回去),每台服务器都需要设置一个唯一的服务器 ID(server-id)。在 MySQL 的配置文件(如 my.cnf 或 my.ini)中可以设置 server-id 参数,且每台服务器的 server-id 必须不同。例如,服务器 A 的 server-id 设置为 1,服务器 B 的 server-id 设置为 2。
  6. 双向复制配置:要实现主主复制,需要在两台服务器上分别进行配置。每台服务器都要配置对方为自己的主服务器,指定对方的 IP 地址、端口、用户名、密码等连接信息。例如,在服务器 A 上配置服务器 B 为其主服务器,在服务器 B 上配置服务器 A 为其主服务器。

一、环境准备

操作系统

主机

描述

安装服务

Centos 7.9

A

MySQL主机

MySQL、Keepalived

Centos 7.9

B

MySQL主机

MySQL、Keepalived

二、MySQL主主复制部署

注意事项:

在做主主同步前,需要特别注意的一个问题:

主主复制和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以设计到自增长重复问题,例如:

出现的问题(多主自增长ID重复)

1)首先在A和B两个库上创建test表结构;

2)停掉A,在B上对数据表test(存在自增长属性的ID字段)执行插入操作,返回插入ID为1;

3)然后停掉B,在A上对数据表test(存在自增长属性的ID字段)执行插入操作,返回的插入ID也是1;

4)然后 同时启动A,B,就会出现主键ID重复

解决方法:

只要保证两台服务器上的数据库里插入的自增长数据不同就可以了

如:A插入奇数ID,B插入偶数ID,当然如果服务器多的话,还可以自定义算法,只要不同就可以了

在下面例子中,在两台主主服务器上加入参数,以实现奇偶插入!

记住:在做主主同步时需要设置自增长的两个相关配置,如下:

auto_increment_offset 表示自增长字段从那个数开始,取值范围是1 .. 65535。这个就是序号。如果有n台mysql机器,则从第一台开始分为设1,2...n

auto_increment_increment 表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535。如果有n台mysql机器,这个值就设置为n。

在主主同步配置时,需要将两台服务器的:

auto_increment_increment 增长量都配置为2

auto_increment_offset 分别配置为1和2。这是序号,第一台从1开始,第二台就是2,以此类推.....

这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。(针对的是有自增长属性的字段)。

1、在A、B节点上安装mysql服务

#步骤一:解压
mkdir -p /opt/sumscope
cd /opt/sumscope
tar -zxvf  mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.44-linux-glibc2.12-x86_64 mysql#步骤二:在/opt/sumscope/mysql目录下创建data logs目录
cd /opt/sumscope/mysql 
mkdir data logs#步骤三:初始化MySQL
cd /opt/sumscope/mysql/bin
./mysqld --defaults-file=/opt/sumscope/mysql/my.cnf --basedir=/opt/sumscope/mysql --datadir=/opt/sumscope/mysql/data --user=root --initialize#步骤四:自定义启动命令
vim /opt/sumscope/mysql/support-files/mysql.server
basedir=/opt/sumscope/mysql
datadir=/opt/sumscope/mysql/data#步骤五:将启动脚本放在/etc/init.d目录下
cp /opt/sumscope/mysql/support-files/mysql.server /etc/init.d/mysql#步骤六:创建mysql用户
useradd mysql 
chown -R mysql.mysql /opt/sumscope/mysql/#步骤七:启动MySQL,修改root用户密码service mysql start cat /opt/sumscope/mysql/logs/mysql_error.log##修改root用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ppp';##使用utf-8编码创建数据库tbook
create database tbook character set utf8 collate utf8_bin;##授权stc用户远程登录tbook数据库 grant all privileges on tbook.* to stc@'%' identified by 'ppp';

2、在节点A上进行相关配置

2.1、修改MySQL的配置

#步骤一:修改mysql的配置
root@master ~]# vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
#socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
socket=/var/lib/mysql/mysql.sock#log-bin=master1server-id = 1        
log-bin = mysql-bin  
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2    
auto-increment-offset = 1   
slave-skip-errors = all #步骤二:重启MySQL服务
[root@master ~]# service mysql restart

2.2、数据同步授权

MySQL [(none)]> grant replication slave,replication client on *.* to root@'192.168.179.131' identified by "ppp";MySQL [(none)]> flush privileges;
MySQL [(none)]> FLUSH TABLES WITH READ LOCK;MySQL [(none)]> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000002 |     3514 |              | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+

2.3、创建同步用户sync

CREATE USER 'sync'@'%' identified by '123456';GRANT REPLICATION SLAVE ON *.*  TO  'sync'@'%';

3、在节点B上进行相关配置

3.1、修改MySQL的配置

root@master ~]# vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
#socket=/tmp/mysql.sock
socket=/var/lib/mysql/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pidserver-id = 2       
log-bin = mysql-bin  
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2    
auto-increment-offset = 2   
slave-skip-errors = all

3.2、数据库同步授权

数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql)同理slave也要授权给master机器远程同步数据的权限。

MySQL [(none)]> grant replication slave,replication client on *.* to root@'192.168.179.129' identified by "ppp";MySQL [(none)]> flush privileges;
MySQL [(none)]> FLUSH TABLES WITH READ LOCK;MySQL [(none)]> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000009 |     1945 |              | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+

3.3、执行主主同步操作

先在slave数据库上做同步master的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)

MySQL [(none)]> unlock tables;MySQL [(none)]> stop slave;MySQL [(none)]> change master to master_host='192.168.179.129',master_user='root',master_password='ppp',master_log_file='mysql-bin.000002',master_log_pos=3514;MySQL [(none)]> start slave;MySQL [(none)]> show slave status \G;

4、在节点A上执行同步操作

MySQL [(none)]> unlock tables;MySQL [(none)]> stop slave;MySQL [(none)]> change master to master_host='192.168.179.131',master_user='root',master_password='ppp',master_log_file='mysql-bin.000009',master_log_pos=1945;MySQL [(none)]> start slave;MySQL [(none)]> show slave status \G;

5、测试MySQL主主同步的效果

5.1、在A、B节点上写入数据查看数据同步效果

在节点A上写入数据

5在节点B上查看数据并进行读写操作

 

5.2、测试结论

在上述测试操作后可知节点A写入的数据能被节点B进行增删改操作,节点B写入的数据也能被节点A进行增删改操作,两个MySQL数据库实现了双主复制。

三、安装Keepalived服务

1、在节点A上安装Keepalived作为master节点

#步骤一:安装编译需要的软件包
[root@master ~]# yum install -y pcre-devel openssl-devel popt-devel  #安装依赖包#步骤二:安装keepalived服务
[root@master ~]# tar zxvf keepalived-1.2.7.tar.gz
[root@master ~]# cd keepalived-1.2.7
[root@master ~]# ./configure --prefix=/usr/local/keepalived
[root@master ~]# make && make install#将keepalived配置成系统服务
[root@master ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@master ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@master ~]# mkdir /etc/keepalived/
[root@master ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@master ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/#步骤三:配置keepalived配置文件
########################################################配置文件###############################################
[root@master ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id keep1;                                         #keep1是本节点的标识,一般为hostnamescript_user root                                         #使用root执行            enable_script_security
}vrrp_script check_mysql {script "/etc/keepalived/check_mysql.sh"#检测MySQL状态的脚本路径interval 2                                              #检测间隔时间weight -20                                              #如果如果上述条件成立权重-20fall 2                                                  #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)rise 1                                                  #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {state MASTER                                            #主节点为MASTER,从节点为BACKUPinterface ens33                                         #本机网卡名称virtual_router_id 100                                   #虚拟路由的ID号,两个节点设置的参数必须一样,相同的VRID为一组,它将决定多播的地址。mcast_src_ip 192.168.179.131                            #本机的IP地址priority 100                                            #节点的优先级(0~254之间),MASTER比BACKUP高nopreempt                                               #优先级设置,异常恢复后再次抢占的问题。advert_int 1                                            #组播信息发送间隔,两个的参数必须一样,默认为1s。authentication {auth_type PASSauth_pass p                                           #按照实际生产的需求来(一般为root密码)}track_script {check_mysql}virtual_ipaddress {192.168.179.88                                        #虚拟IP地址,两台主机的必须一致。}
}
########################################################配置文件################################################步骤四:配置keepalived检测脚本内容
########################################################MySQL检测脚本内容###############################################
[root@master ~]# vim /etc/keepalived/check_mysql.sh    #检测MySQL服务断开就杀掉keepalived进程,使VIP漂移#!/bin/bash                     counter=$(netstat -na|grep "LISTEN"|grep ":3306 "|wc -l)if [ "${counter}" -eq 0 ]; thenservice keepalived stopfi########################################################MySQL检测脚本内容################################################步骤五:对检测脚本添加执行权限、启动keepalived服务[root@master ~]# chmod +x /etc/keepalived/check_mysql.sh[root@master ~]# /etc/init.d/keepalived start

2、在节点B上安装Keepalived作为slave节点

安装步骤与节点A上安装的方法相同,但是配置文件需要修改

#步骤一:配置keepalived配置文件
########################################################配置文件###############################################
[root@slave ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id keep2;script_user rootenable_script_security
}vrrp_script check_mysql { script "/etc/keepalived/check_mysql.sh"     #检测脚本所在的位置interval 2weight -20fall 2rise 1
}
vrrp_instance VI_1 {state BACKUP                        #修改状态名称interface ens33                     #修改网卡名称virtual_router_id 100mcast_src_ip 192.168.179.133        #自己的IP地址priority 80                         #作为备节点权重要比主节点小advert_int 1authentication {auth_type PASSauth_pass p}track_script {check_mysql                       }virtual_ipaddress {192.168.179.88                   #虚拟IP地址}
}
########################################################配置文件################################################步骤二:配置keepalived检测脚本内容用于检测MySQL的状态
########################################################MySQL检测脚本内容###############################################
[root@master ~]# vim /etc/keepalived/check_mysql.sh    #检测MySQL服务断开就杀掉keepalived进程,使VIP漂移#!/bin/bash                     counter=$(netstat -na|grep "LISTEN"|grep ":3306 "|wc -l)if [ "${counter}" -eq 0 ]; thenservice keepalived stopfi########################################################MySQL检测脚本内容################################################步骤三:对检测脚本添加执行权限、启动keepalived服务[root@master ~]# chmod +x /etc/keepalived/check_mysql.sh[root@master ~]# /etc/init.d/keepalived start   

注意:因为keepalived中配置了MySQL状态检测脚本,keepalived在启动时会执行检测脚本,所以等MySQL服务启动成功后再启动keepalived服务,否则服务将无法启动keepalived。

四、高可用场景测试

模拟场景一:当主机MySQL出现故障(3306端口不存在)

步骤一:分别在主机和备机上添加对虚拟IP的验证方式

步骤二:关闭节点A上的MySQL服务

因为配置了权重原因虚拟IP在节点A上,关闭MySQL服务看keepalived服务是否会运行mysql状态检测脚本的内容从而使虚拟IP漂移到节点B上。

步骤三:验证虚拟IP是否漂移到节点B上

在浏览器上验证:输入:http://192.168.179.88/a.html

结论:虚拟IP从主节点漂移到从节点上

步骤四:模拟故障恢复虚拟IP自动迁回

 在浏览器上验证:输入:http://192.168.179.88/a.html

结论:因为主机故障恢复,主节点上的keepalived配置的权重要比从节点的权重要高,所以虚拟IP自动从从节点漂移到从主点上 

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

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

相关文章

SpringBoot AOP 源码解析

文章目录 一、AOP 代码示例1. 准备注解和目标类2. 定义 Aspect3. 结论 二、源码1. AOP 实现核心类2. 代理类的创建流程2.1 核心类 AbstractAutoProxyCreator2.2 AbstractAutoProxyCreator#postProcessBeforeInstantiation2.3 AspectJAwareAdvisorAutoProxyCreator#shouldSkip2.…

Linux:Shell环境变量与命令行参数

目录 Shell的变量功能 什么是变量 变数的可变性与方便性 影响bash环境操作的变量 脚本程序设计(shell script)的好帮手 变量的使用:echo 变量的使用:HOME 环境变量相关命令 获取环境变量 环境变量和本地变量 命令行…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 5

第05章_存储引擎 为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为MySQLserver的功能,把真实存取数据的功能划分为存储引擎的功能。所t以在MySQLserver完成了查询优化后,只需按照生成的执行…

JAVA面试_进阶部分_23种设计模式总结

1. 单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这 个实例。 (1)懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载…

渗透测试(WAF过滤information_schema库的绕过,sqllib-46关,海洋cms9版本的注入)

1.sqlin-lib 46关 打开网站配置文件发现 此网站的对ID进行了排序,我们可以知道,order by接不了union ,那我们可以通过测试sort,rond等函数,观察网页的反馈来判断我们的盲注是否正确 我们发现 当参数有sort来排序时&…

AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障

在卫星导航领域,北斗系统作为我国自主研发的全球卫星导航系统,正以其独特的短报文通信功能引发全球范围内的广泛关注。这一突破性技术不仅使北斗系统在全球四大导航系统中独树一帜,具备了双向通信能力,更通过遨游通讯推出的AORO M…

ARCGIS国土超级工具集1.4更新说明

ARCGIS国土超级工具集V1.4版本,功能已增加至54 个。本次更新在V1.3版本的基础上,新增了“拓扑问题修复工具”并同时调整了数据处理工具栏的布局、工具操作界面的选择图层下拉框新增可选择位于图层组内的要素图层功能、数据保存路径新增了可选择数据库内的…

Element Plus中el-select选择器的下拉选项列表的样式设置

el-select选择器,默认样式效果: 通过 * { margin: 0; padding: 0; } 去掉内外边距后的样式效果(样式变丑了): 通过 popper-class 自定义类名修改下拉选项列表样式 el-select 标签设置 popper-class"custom-se…

基于Linux系统的物联网智能终端

背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…

java excel xlsx 增加数据验证

隐藏表下拉框 // 创建隐藏工作表存储下拉框数据String hiddenSheetName "HiddenSheet"System.currentTimeMillis();Sheet hiddenSheet workbook.createSheet(hiddenSheetName);//设置隐藏sheetworkbook.setSheetHidden(workbook.getSheetIndex(hiddenSheetName), …

linux中安装部署Jenkins,成功构建springboot项目详细教程

参考别人配置Jenkins的git地址为https,无法连上github拉取项目,所以本章节介绍通过配置SSH地址来连github拉取项目 目录: 1、springboot项目 1.1 创建名为springcloudproject的springboot项目工程 1.2 已将工程上传到github中,g…

提升数据洞察力:五款报表软件助力企业智能决策

概述 随着数据量的激增和企业对决策支持需求的提升,报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告,并将数据可视化,从而推动更智能的决策过程。 1. 山海鲸报表 概述: 山海鲸报表…

MySQL中replace函数用法

语法:replace(field,search,replace) 说明:field - 数据库表的列名 search - 需要替换的字符串 replace - 替换成的字符串 语义:将列名:field 中出现的search字符串,全部替换成replace字符串。 例子: …

Wireshark Lua 插件教程

本⽂主要介绍 Lua 脚本在 Wireshark 中的应⽤, Lua 脚本可以在 Wireshark 中完成如下功能: 从⽹络包中提取数据, 或者统计⼀些数据包(Dumper) 需要解析⼀种 Wireshark 不提供原⽣⽀持的协议(Dissector) ⽰例 协议解析 VREP 协议是 NOGD 框架对于 TRIP 协议的⼀种延伸和扩展…

吐血整理:在 Docker 中运行 Milvus

直接用docker 错误命令(这个我试了三遍,浪费了很多时间): docker run -d --name milvus -p 19530:19530 -p 9091:9091 -v /var/lib/milvus:/var/lib/milvus milvusdb/milvus:latest 先看报错: 2025-02-24 16:02:39 …

【uniapp】在UniApp中实现持久化存储:安卓--生成写入数据为jsontxt

在移动应用开发中,数据存储是一个至关重要的环节。对于使用UniApp开发的Android应用来说,缓存(Cache)是一种常见的数据存储方式,它能够提高应用的性能和用户体验。然而,缓存数据在用户清除缓存或清除应用数…

【Excel】 Power Query抓取多页数据导入到Excel

抓取多页数据想必大多数人都会,只要会点编程技项的人都不会是难事儿。那么,如果只是单纯的利用Excel软件,我还真的没弄过。昨天,我就因为这个在网上找了好久发好久。 1、在数据-》新建查询-》从其他源-》自网站 ,如图 …

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技(688031.SH)正式发布DeepSeek全场景解决方案,全面覆盖个人用户、企业客户及行业场景需求,为用户提供从个人到企业、从云端到本地的全方位AI应用支持,为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…

let、const【ES6】

‌“我唯一知道的就是我一无所知。” - 苏格拉底 目录 块级作用域:var、let、const的对比:Object.freeze(): 块级作用域: 块级作用域指由 {} 包围的代码块(如 if、for、while、单独代码块等)形成的独立作用…

C++ 常见面试知识点

主要介绍C常见面试题 1、说一下你理解的C中的四种智能指针 常用接口 T* get(); T& operator*(); T* operator->(); T& operator(const T& val); T* release(); 将 封装在内部的指针置为nullptr, 但并不会破坏指针所指向的内容, 函 数返回的是内部指针置空之前…