Docker--利用dockerfile搭建mysql主从集群和redis集群
Docker镜像制作的命令 链接
Docker 镜像制作的注意事项 链接
搭建mysql主从集群
mysql主从同步的原理
MySQL主从同步(Replication)是一种实现数据冗余和高可用性的技术,通过将主数据库(Master)的变更操作同步到一个或多个从数据库(Slave),实现数据的实时或准实时复制。
为什么要用主从分离?
读写分离,提高性能:主库负责写,从库负责读
数据实时备份:主库的数据实时存储到从库
高可用HA:当有一个节点发生故障时,可以随时切换
核心流程
主库记录变更日志(Binary Log)
- 主库将所有数据变更操作(如INSERT、UPDATE、DELETE)记录到二进制日志(Binary Log)中。
- Binary Log是二进制格式的文件,记录了每个事务的SQL语句或行级变更。
从库读取主库的日志
- 从库通过I/O线程连接到主库,并请求读取Binary Log。
- 主库的I/O线程将Binary Log的内容发送给从库。
从库重放日志(Relay Log)
- 从库将接收到的Binary Log写入本地的中继日志(Relay Log)。
- 从库的SQL线程读取Relay Log,并按照顺序执行其中的SQL语句,从而实现数据同步。
数据一致性保障
- 主库和从库通过日志的顺序执行保证数据一致性。
- 异步复制模式下,从库可能稍有延迟;半同步复制模式下,主库会等待至少一个从库确认接收日志。
主从分布架构图

| 组件 | 作用 |
|---|---|
| Binary Log | 主库记录所有数据变更的日志,是主从同步的核心。 |
| I/O线程 | 从库的线程,负责从主库获取Binary Log并写入Relay Log。 |
| SQL线程 | 从库的线程,负责读取Relay Log并执行其中的SQL语句。 |
| Relay Log | 从库本地存储主库Binary Log的中间日志,用于SQL线程重放。 |
当主节点mysql接收到数据的时候,向binlog写入事务,binlog通过多线程的读取,发送到从节点,从节点先由IO线程接收,然后再写入laylog中,之后让laolog线程进行读取,最后放入到从节点的mysql中
主从同步的方式
异步复制(Asynchronous Replication)
主库提交事务后立即返回,不等待从库确认。
- 优点:性能高,延迟低。
- 缺点:从库可能滞后,数据一致性较差。

半同步复制(Semi-Synchronous Replication)
主库提交事务后,至少等待一个从库确认接收日志。
- 优点:数据一致性更好。
- 缺点:性能略有下降。

全同步复制(Synchronous Replication)
主库提交事务后,等待所有从库确认接收日志。
- 优点:数据一致性更好。
- 缺点:性能较低。

增强半同步复制 (Rising-Semi-Synchronous Replication)
对半同步复制做的一个改进,原理上几乎是一样的,主要是解决幻读的问题.
- 优点:数据一致性更好,解决幻读问题
- 缺点:性能略有下降

主要配置
1.主库配置
启用Binary Log:
[mysqld]
log-bin=mysql-bin
server-id=1 # 唯一标识符
创建同步用户(供从库连接):
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
2.从库配置
指定主库信息:
CHANGE MASTER TOMASTER_HOST='master_host',MASTER_USER='repl',MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;
启动同步:
START SLAVE;
3.验证同步状态
检查从库状态:
SHOW SLAVE STATUS\G;
实战
创建对应目录

编辑Master目录下的Dockerfile:
FROM mysql:5.7.36
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
FROM mysql:5.7.36:这一行指定了 Docker 镜像的基础镜像。
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime:
- RUN 是 Dockerfile 中的一个指令,表示在构建镜像时运行指定的命令。
- ln -sf 是创建符号链接(symbolic link)的命令:
- -s 表示创建符号链接(软链接)。
- -f 表示如果目标文件已存在,则强制覆盖。
- /usr/share/zoneinfo/Asia/Shanghai 是系统中的时区文件,表示中国上海时区(东八区)。
- /etc/localtime 是 Linux 系统中表示当前容器时区的文件。
这一行的作用是将 /etc/localtime 链接到 /usr/share/zoneinfo/Asia/Shanghai,从而将容器的时区设置为上海时区(UTC+8)。
编辑slave目录下的Dockerfile:
FROM mysql:5.7.36
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY ./slave/slave.sql /docker-entrypoint-initdb.d
编辑slave.sql
change master to master_host='mysql-master',
master_user='root',master_password='root',master_port=3306;
start slave;
CHANGE MASTER TO语句:用于配置从库连接主库的相关信息。
参数说明:
- master_host=‘mysql-master’:
指定主库的主机名或 IP 地址,这里的主库名是 mysql-master。- master_user=‘root’:
指定用于从库连接主库的用户名,这里是 root。- master_password=‘root’:
指定用于从库连接主库的密码,这里是 root。- master_port=3306:
指定主库的端口号,这里是默认的 MySQL 端口 3306。- 作用:
这部分语句告诉从库如何连接到主库,包括主库地址、用户名、密码和端口号
START SLAVE语句:
- 用于启动从库的复制进程。
- 在执行 CHANGE MASTER TO 配置后,从库需要执行 START SLAVE; 才能开始从主库拉取数据并同步
在主目录mysqlcluster下创建docker-compose.yml文件进行编辑:
name: mysqlclusterservices:mysql-master:build:context: ./dockerfile: ./master/Dockerfileimage: mysqlmaster:1.0restart: alwayscontainer_name: mysql-mastervolumes:- ./mastervarlib:/var/lib/mysqlports:- 8080:3306environment:MYSQL_ROOT_PASSWORD: rootprivileged: truecommand: ['--server-id=1','--log-bin=master-bin','--binlog-ignore-db=mysql','--binlog_cache_size=256M','--binlog_format=mixed','--lower_case_table_names=1','--character-set-server=utf8','--collation-server=utf8_general_ci']mysql-slave:build:context: ./dockerfile: ./slave/Dockerfileimage: mysqlslave:1.0restart: alwayscontainer_name: mysql-slavevolumes:- ./slavevarlib:/var/lib/mysqlports:- 8081:3306environment:MYSQL_ROOT_PASSWORD: rootprivileged: truecommand: ['--server-id=2','--relay_log=slave-relay','--lower_case_table_names=1','--character-set-server=utf8','--collation-server=utf8_general_ci']depends_on:- mysql-mastermysql-slave2:build:context: ./dockerfile: ./slave/Dockerfileimage: mysqlslave:1.0restart: alwayscontainer_name: mysql-slave2volumes:- ./slavevarlib2:/var/lib/mysqlports:- 8082:3306environment:MYSQL_ROOT_PASSWORD: rootprivileged: truecommand: ['--server-id=3','--relay_log=slave-relay','--lower_case_table_names=1','--character-set-server=utf8','--collation-server=utf8_general_ci']depends_on:- mysql-master
mysql-master:
restart:指定容器的重启策略。
always 表示无论容器因何种原因退出,Docker 都会尝试重新启动它。
volume:用于将主机目录挂载到容器中
./mastervarlib是主机上的目录,/var/lib/mysql是容器中 MySQL 默认的数据存储路径。
作用:将 MySQL 的数据存储在主机上,确保容器重启或删除后数据不会丢失。
envirnment:设置环境变量
MYSQL_ROOT_PASSWORD: root 指定 MySQL 的 root 用户密码为 root。
privileged:设置容器以特权模式运行
command:
设置 MySQL 服务器的唯一 ID,主从复制中必须指定,且每个服务器的 ID 必须唯一
启用二进制日志(Binary Log),日志文件前缀为 master-bin,记录主库的写操作
指定忽略mysql系统数据库的二进制日志记录
设置二进制日志缓存的大小为256MB
设置二进制日志的格式为mixed
设置表名不区分大小写
设置服务器的默认字符集为utf8
设置服务器的默认排序规则为utf8_general_cimysql-slave1:
depends-on:指定服务之间的依赖关系
mysql-slave 服务依赖于 mysql-master 服务
确保在启动 mysql-slave 之前,mysql-master 服务已经启动
创建出镜像并创建启动对应的容器:
docker compose build
docker compose up -d
查看对应状态
docker ps

运行主数据库查看运转
docker exec -it mysql-master bash
连上主库,查看数据库可以看到运行正常
mysql -u root -p

连接上从库,通过命令查看
SHOW MASTER STATUS\G
SHOW SLAVE STATUS\G

主库创建一个数据库
create database test;

从库上查看,可以看到也有了对应的test数据库:

主库上创建表,插入数据:
mysql> use test;
Database changed
mysql> create table users(sno int,sname varchar(20));
Query OK, 0 rows affected (0.03 sec)mysql> insert into users values (1,'xixi');
Query OK, 1 row affected (0.02 sec)mysql> insert into users values (2,'haha');
Query OK, 1 row affected (0.01 sec)
在从表上查看
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| users |
+----------------+
1 row in set (0.00 sec)mysql> select * from users;
+------+-------+
| sno | sname |
+------+-------+
| 1 | xixi |
| 2 | haha |
+------+-------+
2 rows in set (0.00 sec)
至此完成了mysql主从集群的部署;
docker compose down
搭建Redis集群
Redis 集群是 Redis 提供的一种分布式解决方案,旨在通过将数据分布到多个节点上来实现水平扩展和高可用性。它解决了单机 Redis 在存储容量、读写性能和容错能力上的限制,适用于大规模、高并发的应用场景。
核心特性
数据分片(Sharding)
- Redis 集群将数据分散到多个节点上,每个节点负责一部分数据。
- 数据分片基于哈希槽(Hash Slot),共有 16384 个哈希槽,每个键通过哈希算法映射到一个哈希槽,再分配到具体节点。
高可用性
- 每个主节点(Master)可以有多个从节点(Slave)。
- 当主节点故障时,集群会自动将从节点提升为主节点(故障转移),确保服务可用。
水平扩展
- 可以通过增加节点来扩展集群的存储容量和性能。
- 集群支持动态添加或移除节点,无需停机。
无中心架构
Redis集群没有中心节点,所有节点平等,避免了单点故障。
下载源码压缩包
首先,我们要去官网,找到源码的下载链接
redis-7.0.15 版本的链接
组成
- 主节点(Master):负责处理读写请求和存储数据。
- 从节点(Slave):复制主节点的数据,用于故障转移和只读请求。
- 哈希槽(Hash Slot):数据分片的基本单位,共有 16384 个。
准备目录
mkdir /data/ahri/dockerfile/rediscluster/redis
设置redis.conf
在redis目录下创建一个redis.conf进行配置
#表示前台运行
daemonize no
#端口
port 6379
#持久化
dir /data/redis
#启用集群
cluster-enabled yes
#集群参数配置
cluster-config-file nodes.conf
#集群超时时间
cluster-node-timeout 5000
#密码配置
requirepass 123456
#主节点密码配置
masterauth 123456
#表示远端可以连接
bind * -::*
编辑 Dockefile
在redis目录下创建Dockerfile文件进行编辑
注:centos:7 已经停止维护了,所以这里使用了ubuntu
# 第一阶段:构建阶段
FROM ubuntu:22.04 AS buildstage# 更新包列表并安装必要的构建工具和依赖
RUN apt-get update && apt-get install -y \build-essential \wget \gcc \g++ \make \&& rm -rf /var/lib/apt/lists/*# 下载 Redis 源码和配置文件
#wget https://download.redis.io/releases/redis-7.0.15.tar.gz
ADD redis-7.0.15.tar.gz /
ADD redis.conf /redis/# 切换到 Redis 源码目录并编译
WORKDIR /redis-7.0.15
RUN make # 将 Redis 可执行文件移动到指定目录
RUN mv /redis-7.0.15/src/redis-server /redis/ && mv /redis-7.0.15/src/redis-cli /redis/
ENTRYPOINT ["/redis/redis-server", "/redis/redis.conf"]# 第二阶段:运行阶段
FROM ubuntu:22.04
RUN mkdir -p /data/redis && mkdir -p /redis
COPY --from=buildstage /redis /redis
EXPOSE 6379
ENTRYPOINT ["/redis/redis-server", "/redis/redis.conf"]
测试
通过docker build创建镜像进行测试
docker build -t myredis:v1.0 .
尝试启动一个容器进行测试
docker run -d --name myredis --rm myredis:1.0
416541b280d91f04e80c7df864ed097d5471b26bf93a5c82b090d458402217f9

测试成功,释放资源
docker stop myredis
编写Docker-compose.yml
name: redisclusterservices:redis01:image: myredis:1.0build: ./redisports:- 6379:6379container_name: redis01healthcheck:test: /redis/redis-cli pinginterval: 10stimeout: 5sretries: 10redis02:image: myredis:1.0container_name: redis02healthcheck:test: /redis/redis-cli pinginterval: 10stimeout: 5sretries: 10redis03:image: myredis:1.0container_name: redis03healthcheck:test: /redis/redis-cli pinginterval: 10stimeout: 5sretries: 10redis04:image: myredis:1.0container_name: redis04healthcheck:test: /redis/redis-cli pinginterval: 10stimeout: 5sretries: 10redis05:image: myredis:1.0container_name: redis05healthcheck:test: /redis/redis-cli pinginterval: 10stimeout: 5sretries: 10redis06:image: myredis:1.0container_name: redis06healthcheck:test: /redis/redis-cli pinginterval: 10stimeout: 5sretries: 10redis07:image: myredis:1.0container_name: redis07entrypoint: ["/redis/redis-cli","--cluster","create","redis01:6379","redis02:6379","redis03:6379","redis04:6379","redis05:6379","redis06:6379","--cluster-replicas","1","-a","123456","--cluster-yes"]depends_on:redis01:condition: service_healthyredis02:condition: service_healthyredis03:condition: service_healthyredis04:condition: service_healthyredis05:condition: service_healthyredis06:condition: service_healthy
测试
通过下面命令检查配置文件是否书写格式错误
docker compose config
对 容器进行启动
docker compose up -d
查看容器的状态

查看07日志是否创建成功
root@VM-8-12-ubuntu:/data/ahri/dockerfile/rediscluster# docker logs -f redis07
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica redis05:6379 to redis01:6379
Adding replica redis06:6379 to redis02:6379
Adding replica redis04:6379 to redis03:6379
M: 148bf218eac4b30786ef89e5c5cc1bf4facdf4be redis01:6379slots:[0-5460] (5461 slots) master
M: 5964d6968e8527be920f1d60aad8e549ac1c327a redis02:6379slots:[5461-10922] (5462 slots) master
M: 4a33cf88ed2334e78fe468c35446a2a8bd14f805 redis03:6379slots:[10923-16383] (5461 slots) master
S: 4ee8406f204b7ee8778a40f7d6ec979cc4f9bfff redis04:6379replicates 4a33cf88ed2334e78fe468c35446a2a8bd14f805
S: fb59eccda63bd4bb8d33526262612e1ab694da02 redis05:6379replicates 148bf218eac4b30786ef89e5c5cc1bf4facdf4be
S: 8b7b54ee2f4c7a327e1e954db379a519aa7e68b8 redis06:6379replicates 5964d6968e8527be920f1d60aad8e549ac1c327a
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node redis01:6379)
M: 148bf218eac4b30786ef89e5c5cc1bf4facdf4be redis01:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 4a33cf88ed2334e78fe468c35446a2a8bd14f805 172.19.0.5:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 4ee8406f204b7ee8778a40f7d6ec979cc4f9bfff 172.19.0.2:6379slots: (0 slots) slavereplicates 4a33cf88ed2334e78fe468c35446a2a8bd14f805
S: fb59eccda63bd4bb8d33526262612e1ab694da02 172.19.0.7:6379slots: (0 slots) slavereplicates 148bf218eac4b30786ef89e5c5cc1bf4facdf4be
S: 8b7b54ee2f4c7a327e1e954db379a519aa7e68b8 172.19.0.4:6379slots: (0 slots) slavereplicates 5964d6968e8527be920f1d60aad8e549ac1c327a
M: 5964d6968e8527be920f1d60aad8e549ac1c327a 172.19.0.6:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
登录容器01-06任意一个进行查看
登录进redis客户端
docker exec -it redis02 bash
/redis/redis-cli -c -a 123456
查看对应的配置信息
cluster info
查看对应日志
cluster nodes
设置一个key值,然后获取
set a 123
get a
"123"
退出后释放资源
exit
exit
docker compose down
注意:
[ERR] Node redis01:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
出现这个错误时,检查你的 docker-compose.yml 文件或 Docker 命令,确保每个 Redis 实例的端口映射是唯一的,并且没有冲突。
相关文章:
Docker--利用dockerfile搭建mysql主从集群和redis集群
Docker镜像制作的命令 链接 Docker 镜像制作的注意事项 链接 搭建mysql主从集群 mysql主从同步的原理 MySQL主从同步(Replication)是一种实现数据冗余和高可用性的技术,通过将主数据库(Master)的变更操作同步到一个…...
Context的全面解析:在不同技术应用中的通用作用与差异
Context的全面解析:在不同技术应用中的通用作用与差异 引言: 在软件开发中,“Context”这个概念被广泛使用。它不仅限于某个特定的技术或编程语言,实际上,Context 作为一种抽象的设计模式,贯穿在许多开发领…...
蓝桥杯嵌入式考前模块总结
一.RTC 使用RTC直接再cubeMX中配置启动时钟和日历 如第六届省赛 想要让RTC的秒每隔一秒递增1需要在时钟树界面观察RTC的主频 由于RTC时钟主频为32KHZ将异步预分频计数器的值设为31,将同步预分频计数器的值设为999这样就可以将RTC的时钟信号分频为1HZ达到1秒自增的…...
关于举办“2025年第五届全国大学生技术创新创业大赛“的通知
赛事含金量 大赛获奖即可有机会为你的大学里的“创新创业”加分!这是每个大学要求必须修满的学分! 中国“互联网+”大学生创新创业大赛磨刀赛!“挑战杯”中国大学生创业计划大赛必参赛! 国赛获奖,“互联…...
spark安装过程问题
1. Spark-local模式 - 适用于单节点环境,无需启动Hadoop集群。 - 实验步骤包括解压文件、启动Local环境、运行命令行工具、提交测试应用等。 - 通过bin/spark-shell启动本地环境,通过sc.textFile等命令测试功能。 - 提交应用时使用--master loca…...
Ingress蓝绿发布
Ingress蓝绿发布 Ingress常用注解说明yaml资源清单绿色版本yml资源清单蓝色版本yaml资源清单 主Ingress金丝雀Ingress基于客户端请求头的流量切分结果验证 基于客户端来源IP的流量切分结果验证 基于服务权重的流量切分结果验证 基于IP来源区域来切分IP---方案未验证基于User-Ag…...
基于AOP+Log4Net+AutoFac日志框架
1.项目概述 这是一个基于 C# 的 WPF 项目 WpfApp12log4net,它综合运用了依赖注入、日志记录和接口实现等多种技术,同时使用了 Autofac、Castle.Core 和 log4net 等第三方库。 2.配置log4net 新建一个Log4Net.config,配置需要记录的日志信息…...
python推箱子游戏
,--^----------,--------,-----,-------^--,-------- 作者 yty---------------------------^----------_,-------, _________________________XXXXXX XXXXXX XXXXXX ______(XXXXXXXXXXXX(________(------ 0 [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,…...
华为hcie证书的有效期怎么判断?
在ICT行业,华为HCIE证书堪称含金量极高的“敲门砖”,拥有它往往意味着在职场上更上一层楼。然而,很多人在辛苦考取HCIE证书后,却对其有效期相关事宜一知半解。今天,咱们就来好好唠唠华为HCIE证书的有效期怎么判断这个关…...
关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结
以下是关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结: 1. Docker 核心概念 概念描述关系镜像(Image)预定义的只读模板,包含运行环境和配置(…...
PowerBI 条形图显示数值和百分比
数据表: 三个度量值 销售额 SUM(销量表[销售量])//注意, 因为Y轴显示的产品,会被筛选,所以用ALLSELECTED来获取当前筛选条件下,Y轴显示的产品 百分比 FORMAT(DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED(销量表[产品编码]))),"0…...
基于YOLOv8的火车轨道检测识别系统:技术实现与应用前景
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言:火车轨道检测领域概述 铁路运输作为国民经济的大动脉,其安全运行至关重要…...
css使用mix-blend-mode的值difference实现内容和父节点反色
1. 使用场景 往往开发过程中,经常遇到产品说你这个背景图和文字颜色太接近了,能不能适配下背景图,让用户能够看清具体内容是啥。 这么说吧,这种需求场景非常合理,因为你做开发就是要给用户一个交代,给他们…...
【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘
对象的创建 1.类加载检查 虚拟机遇到一条new的指令,首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行类的加载过程。 2.分配内存 在类…...
Pytest多环境切换实战:测试框架配置的最佳实践!
你是否也遇到过这种情况:本地测试通过,一到测试环境就翻车?环境变量错乱、接口地址混乱、数据源配置丢失……这些「环境切换」问题简直像定时炸弹,随时引爆你的测试流程! 测试人员每天都跟不同的环境打交道࿰…...
单细胞多组学及空间组学数据分析与应用
一、引言 生命科学研究正处于快速发展的阶段,随着技术的不断革新,对生物系统的理解也在逐步深入到单细胞和空间层面。单细胞多组学及空间组学技术应运而生,它们突破了传统研究手段在细胞异质性和空间结构解析上的局限,为我们打开…...
[ctfshow web入门] web39
信息收集 题目发生了微妙的变化,只过滤flag,include后固定跟上了.php。且没有了echo $flag;,虽说本来就没什么用 if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){include($c.".php");} }else{…...
HarmonyOS-ArkUI 装饰器V2 @ObservedV2与@Trace装饰器
参考文档: 文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-new-observedv2-and-trace-V14#trace%E8%A3%85%E9%A5%B0%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84由于V2的装饰器比V1的装饰器更加易用,尽管学习的过程中用到的都是V1的装饰器,但…...
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系 在Spring框架的演进长河中,配置方式始终是开发者需要掌握的核心技能。从早期XML一统天下的严谨规范,到注解驱动的敏捷开发,再到如今Java Config的优雅实践&am…...
基于ImGui+FFmpeg实现播放器
基于ImGuiFFmpeg实现播放器 演示: ImGui播放器 继续研究FFmpeg,之前做了一个SDL的播放器,发现SDL的可视化UI界面的功能稍微差了点,所以今天我们换了一个新的工具,也就是ImGui。 ImGui官方文档:https://g…...
python的web框架flask(hello,world版)
问题 最近需要基于一个开源项目进行二次开发,但是,现在的我主修java,从来没有接触过python的web开发。所以,我现在需要学习一下flask的hello,world。 python版本选择 通过这个Python版本状态页面Status of Python v…...
Java面试39-Zookeeper中的Watch机制的原理
Zookeeper是一个分布式协调组件,为分布式架构下的多个应用组件提供了顺序访问控制能力。它的数据存储采用了类似于文件系统的树形结构,以节点的方式来管理存储在Zookeeper上的数据。 Zookeeper提供了一个Watch机制,可以让客户端感知到Zooke…...
同时打开多个Microchip MPLAB X IDE
0.引用 Microchip 32位MCU CAN驱动图文教程-附源码 - 哔哩哔哩 https://bbs.21ic.com/icview-3391426-1-1.html https://bbs.21ic.com/icview-3393632-1-1.html 1.前言 工作中接触到使用Microchip 的 MPLAB X IDE 开发工具,使用的MCU是Microchip SAMD21J18A MCU…...
达梦数据库使用druid提示:dbType not support : dm
简单处理: 移除wall即可 (但是用druid那都希望能用上它的功能的,不然为什么不用其他没带检查的jdbc呢。) 中等复杂处理: druid 是阿里开源的项目,所以去github上找对应版本的源码下载:https:/…...
[定位器]晶艺LA1823,4.5V~100V, 3.5A,替换MP9487,MP9486A,启烨科技
Features 4.5V to 100V Wide Input Range 3.5A Typical Peak Current Limit Integrated 500mΩ low resistance high side power MOS. Constant On Time Control with Constant Switching Frequency. 180μA Low Quiescent Current 150kHz/240kHz/420kHz Swi…...
难度偏低,25西电人工智能学院821、833、834考研录取情况
1、人工智能学院各个方向 2、人工智能学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、智能院25年院线相对于24年院线 全部专业下降比较多,其中控制科学与工程下降20分,计算机科学与技术下降20分,计算机技术[专硕]下降…...
使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第七讲)
这一期来讲解与文本框配套使用的键盘,以及键盘如何在项目中开启。 打开GUI_guider软件平台,在左上角点开工程选项,在该栏目的最下方点击系统设置。 随后在系统设置界面中点击项目选项,选择显示键盘。 在该界面中可以设置键盘文字…...
【C#知识点详解】List<T>储存结构详解
今天来介绍一下List内部的存储结构,话不多说直接开始。 内部数据 List内部采用了连续数组的方式存储数据,其中包含了三个重要的成员变量,示例如下: // 用于存储数据的数组 internal T[] _items; // 列表中实际包含数据的数量 int…...
设计模式:代理模式 - 控制访问与增强功能的艺术
一、为什么使用代理模式? 在开发中,你是否遇到过以下问题: • 某些功能调用需要权限校验,但不希望修改核心逻辑? • 某些对象的创建开销过高,希望延迟加载以优化性能? • 在不改变原始类的情…...
C++二分查找
一、模板①:向下取整(mid (l r) >> 1) while (l < r) {int mid l r >> 1; // 等价于 (l r) / 2(向下取整)if (check(mid)) r mid; // 保留左半区else l mid 1; // 舍弃左半区 } 适用场…...
