【2024】使用Docker搭建redis sentinel哨兵模式集群全流程(包含部署、测试、错误点指正以及直接部署)
目录💻
- 前言
- **Docker Compose介绍**
- 最终实现效果
- 一、搭建集群
- 1、创建文件结构
- 2、创建redis节点
- 3、验证节点
- 4、创建sentinel哨兵
- 5、验证Sentinel功能
- 二、spring连接
- 1、添加依赖
- 2、添加配置
- 3、启动测试
- 三、直接部署流程
- 1、拉取配置
- 2、修改端口创建
前言
本篇文章主要是因为工作需要搭建一个哨兵模式的集群,提供给后端服务使用,所以编写的一个搭建使用流程。
采用的是Docker Compose 进行统一管理搭建的一个一主二从,三个哨兵的集群,版本是选的一个redis:6.0
的版本或者更新也行。
Docker Compose介绍
Docker Compose 是 Docker 提供的一个工具,用于定义和运行多容器 Docker 应用程序。它的主要目的是简化多服务应用程序的部署和管理,特别是在开发和测试环境中。
1. 功能与目的
- 简化容器管理:Docker Compose 允许用户在一个 YAML 文件(默认是 docker-compose.yml)中定义多个服务及其配置,使用单个命令进行创建和启动。这些服务可以是应用程序的不同微服务、数据库、缓存、队列等。
- 定义应用的架构:它不仅仅是启动 Docker 容器的命令工具,还可以定义容器之间如何通信、环境变量、卷、网络等,提供一种可复用的方式来描述和配置应用的运行环境。
- 开发和测试环境:Compose 特别适用于开发环境,因为它可以快速重建、重启或清除测试或开发环境,非常适合持续集成(CI)和开发周期。
2. 主要命令
docker-compose up -d
创建并启动定义在配置中的所有服务。docker-compose down
停止并删除所有创建的容器、网络、卷。docker-compose ps
查看正在运行的容器。docker-compose logs
查看服务的日志。docker compose up -d --force-recreate
停止删除原有配置中的所有服务,并且重新创建启动
最终实现效果
1.监控:监控主从服务的运行,当被监控的redis服务实例发生问题时(变为 down)日志输出状态,
2. 自动故障转移:发生故障达到指定时间后哨兵会从所有副本服务器中选举出一个新的主服务器,并将其他副本重新配置为该新的主服务器的从服务器。
架构图
如果不想一步一步来,可以直接移步到最下面,把我仓库的拉取到本地自己直接部署使用
一、搭建集群
1、创建文件结构
-
先切换为 root角色,要不然可能有些会没权限
sudo su root # 密码
-
创建文件结构,用于存放文件
选择自己要存放的目录下,执行创建文件夹的目录mkdir -p redis-sentinel/master-slave/config redis-sentinel/master-slave/data/master redis-sentinel/master-slave/data/master redis-sentinel/master-slave/data/slave1 redis-sentinel/master-slave/data/slave2 redis-sentinel/sentinel/sentinel1 redis-sentinel/sentinel/sentinel2 redis-sentinel/sentinel/sentinel3
具体结构展示
2、创建redis节点
-
先进入master-slave/config文件夹,创建配置文件
cd master-slave/config
-
创建配置文件
- 编写主节点redis-master配置文件
写入内容vim redis-master.conf
slave-announce-ip
需要改为自己docker宿主机的ip#集群客户端连接密码 requirepass 123456 # 从节点连接主节点的验证密码,因为每个主节点都可能挂掉变为从节点,所以都需要masterauth用于校验 masterauth 123456 #指定 master的ip 这边设置是为了防止主挂掉后,重启后ip会变成自己容器中的IP slave-announce-ip 192.168.192.12 #指定 master的端口,需要和下面文件映射的ports端口一致 slave-announce-port 6479 #0.0.0.0在服务器的环境中,指的就是服务器上所有的ipv4地址 bind 0.0.0.0
- 编写从节点redis-slave1配置文件
写入内容vim redis-slave1.conf
从节点需要添加slaveof
,是master的ip和端口
slave-announce-ip
一样需要改为自己docker宿主机的ip#集群客户端连接密码 requirepass 123456 # 从节点连接主节点的验证密码,因为每个主节点都可能挂掉变为从节点,所以都需要masterauth用于校验 masterauth 123456 #slave节点需要添加slaveof用于指定主节点 slaveof 192.168.192.12 6479 #指定 slave的ip 这边设置是为了防止主挂掉后,重启后ip会变成自己容器中的IP slave-announce-ip 192.168.192.12 #指定 salve的端口 slave-announce-port 6480 #0.0.0.0在服务器的环境中,指的就是服务器上所有的ipv4地址 bind 0.0.0.0
- 编写从节点redis-slave2配置文件
写入内容vim redis-slave2.conf
从节点需要添加slaveof
,是master的ip和端口
slave-announce-ip
一样需要改为自己docker宿主机的ip#集群客户端连接密码 requirepass 123456 # 从节点连接主节点的验证密码,因为每个主节点都可能挂掉变为从节点,所以都需要masterauth用于校验 masterauth 123456 #slave节点需要添加slaveof用于指定主节点 slaveof 192.168.192.12 6479 #指定 slave的ip 这边设置是为了防止主挂掉后,重启后ip会变成自己容器中的IP slave-announce-ip 192.168.192.12 #指定 salve的端口 slave-announce-port 6481 #0.0.0.0在服务器的环境中,指的就是服务器上所有的ipv4地址 bind 0.0.0.0
- 执行命令步骤
- 编写主节点redis-master配置文件
-
编写docker-compose.yml文件
-
退回master-slave目录下
cd ..
-
创建
docker-compose.yml
文件vim docker-compose.yml
不要去自定义networks网络,会无法提供给容器之外的服务进行连接
services: #主节点redis-master:# 版本image: redis:6.0container_name: redis-masterports:- "6479:6379"#绑定数据卷,方便指向对应节点的配置文件和数据存放文件volumes:- ./config/redis-master.conf:/usr/local/etc/redis/redis.conf- ./data/master:/data#添加配置,指定配置文件位置,为映射到容器的配置文件位置command: ["redis-server", "/usr/local/etc/redis/redis.conf"]#从节点1redis-slave1:image: redis:6.0container_name: redis-slave1ports:- "6480:6379"volumes:- ./config/redis-slave1.conf:/usr/local/etc/redis/redis.conf- ./data/slave1:/data#添加配置depends_on:- redis-mastercommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]redis-slave2:image: redis:6.0container_name: redis-slave2ports:- "6481:6379"volumes:- ./config/redis-slave2.conf:/usr/local/etc/redis/redis.conf- ./data/slave2:/datadepends_on:- redis-mastercommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]# 这个地方注意不能自定义创建网络,服装外部服务不能连接 # networks: # redisco:
-
-
创建容器
-
创建容器
在docker-compose文件的位置执行下面命令创建容器docker-compose up -d
-
检查容器
在使用docker-compose ps
查看如果都启动则代表成功、执行命令步骤
如果有问题则可以使用docker-compose down
删除掉容器,排除问题后在重新执行创建命令
-
3、验证节点
- 检查从节点是否绑定成功
-
进入主节点容器
docker exec -it redis-master /bin/bash
-
通过redis-cli连接redis
redis-cli -a [密码]
-
通过
info Replication
命令查看连接信息
是否分别显示了创建的两个从节点,并且state=online
state常见错误显示
- state=disconnected :
表示从节点与主节点的连接已经断开,可能是因为网络故障、主节点下线或者配置错误。 - state=wait_replconf_ack :
从节点正等待主节点的 ACK 确认。这是哨兵模式下的常见状态,表示从节点知道主节点正在选举新的主节点,或者主节点正在进行故障转移。 - state=wait_bgsave :
当主节点正在启动一个后台保存过程(如 AOF 重写或 RDB 快照),从节点会处于这个状态,等待主节点完成这个操作以便开始同步。
- state=disconnected :
-
- 检查是否可以主节点正常写入,并且数据同步到从节点
- 直接在主节点写入
set name zhangsan
- 连接从节点进行查看
可以选择在外部通过客户端进行连接查看,ip是安装docker的宿主机的ip,端口就是设置的对应的映射出来的端口,可以看到刚刚在主节点写入的数据则代表当前主从集群搭建成功。接下来搭建哨兵节点,用来自动管理集群。
- 直接在主节点写入
4、创建sentinel哨兵
创建的是sentinel哨兵,因为只有达到三个哨兵才满足基本的投票选举机制
- 创建配置文件
-
进入sentinel目录
cd ../sentinel/
-
分别编写3个sentinel节点的配置文件
-
在sentinel1目录下创建
sentinel1.conf
节点文件vim sentinel1/sentinel1.conf
编写文件
ip需要改为自己ip#设置为 no 意味着 Redis 实例将允许外部网络的客户端连接 protected-mode no #Sentinel1哨兵节点的端口 port 26379 #监听redis主节点的 Ip 端口 sentinel monitor mymaster 192.168.192.12 6479 2 #定义了Redis主节点在多长时间内无响应,Sentinel将认为它已经宕机 sentinel down-after-milliseconds mymaster 5000 #设置 Sentinel 执行一次故障转移的超时时间 sentinel failover-timeout mymaster 60000 #redis节点密码 sentinel auth-pass mymaster 123456 #指定ip和端口 sentinel announce-ip "192.168.192.12" sentinel announce-port 26379
-
在sentinel2目录下创建
sentinel2.conf
节点文件vim sentinel2/sentinel2.conf
编写文件
内容和sentinel1的一样,就是把端口改一下#设置为 no 意味着 Redis 实例将允许外部网络的客户端连接 protected-mode no #Sentinel1哨兵节点的端口 port 26380 #监听redis主节点的 Ip 端口 sentinel monitor mymaster 192.168.192.12 6479 2 #定义了Redis主节点在多长时间内无响应,Sentinel将认为它已经宕机 sentinel down-after-milliseconds mymaster 5000 #设置 Sentinel 执行一次故障转移的超时时间 sentinel failover-timeout mymaster 60000 #redis节点密码 sentinel auth-pass mymaster 123456 #指定ip和端口 sentinel announce-ip "192.168.192.12" sentinel announce-port 26380
-
在sentinel3目录下创建
sentinel3.conf
节点文件vim sentinel3/sentinel3.conf
编写文件
内容和sentinel1的一样,就是把端口改一下#设置为 no 意味着 Redis 实例将允许外部网络的客户端连接 protected-mode no #Sentinel1哨兵节点的端口 port 26381 #监听redis主节点的 Ip 端口 sentinel monitor mymaster 192.168.192.12 6479 2 #定义了Redis主节点在多长时间内无响应,Sentinel将认为它已经宕机 sentinel down-after-milliseconds mymaster 5000 #设置 Sentinel 执行一次故障转移的超时时间 sentinel failover-timeout mymaster 60000 #redis节点密码 sentinel auth-pass mymaster 123456 #指定ip和端口 sentinel announce-ip "192.168.192.12" sentinel announce-port 26381
-
- 创建docker-compose文件
-
在sentinel目录下创建docker-compose文件
vim docker-compose.yml
-
编写内容
需要加上--sentinel
,不用指定具体的网络services:sentinel1:image: redis:6.0container_name: sentinel1ports:- "26379:26379"volumes:- ./sentinel1:/usr/local/etc/redis#--sentinel 表示将启动一个 Sentinel 实例,不加则表示启动的普通实例command: redis-sentinel /usr/local/etc/redis/sentinel1.conf --sentinelsentinel2:image: redis:6.0container_name: sentinel2ports:- "26380:26379"volumes:- ./sentinel2:/usr/local/etc/rediscommand: redis-sentinel /usr/local/etc/redis/sentinel2.conf --sentinelsentinel3:image: redis:6.0container_name: sentinel3ports:- "26381:26379"volumes:- ./sentinel3:/usr/local/etc/rediscommand: redis-sentinel /usr/local/etc/redis/sentinel3.conf --sentinel
-
- 创建sentinel节点
-
在当前目录执行
docker-compose up -d
-
查看节点
使用docker-compose ps
查看如果都启动则代表成功
-
- 检查是否监听到redis集群节点
-
进入sentinel容器,
docker exec -it sentinel1 /bin/bash
-
通过redis-cli 连接
-p
表示对应节点的端口redis-cli -p 26379
-
输入
info Sentinel
查看节点信息
info Sentinel相关重要信息解读
sentinel_masters:1
:表示当前这个Sentinel实例正在监控1个主(master)Redis实例master0
:监听的主节点信息name=mymaster
:这里给出了正在监控的主实例的名称status=ok
:这个主实例的状态是正常的;status字段并不是一个静态值,还可能会显示下面的错误的信息status=disconnected
:表示Sentinel已经丢失了与该master或slave的连接。当主从连接出现网络问题或者实例宕机时,Sentinel无法与之通信就会显示这个状态status=down
:当Sentinel判断Redis实例(主或从)已经宕机或不可用时,该状态显示为down。监听的主实例显示down,Sentinel会尝试进行故障转移。status=reconnecting
:Sentinel试图重新连接到之前丢失连接的实例时,状态可能为reconnectingstatus=become_slave
:在故障转移过程中,新选举出的主实例可能被标记为become_slave,因为这个实例原本可能是从实例,在故障转移过程中被Sentinel提升为新的主实例
address=192.168.192.35:6479
:主实例的IP地址和端口- slaves=2:这个主实例有2个从(slave)实例
- sentinels=3:有3个Sentinel实例(包括当前这个)在监控这个主实例
5、验证Sentinel功能
-
先把主节点关闭掉
docker stop redis-master
-
查看Sentinel状态
可以看到appress的监听到的端口已经变为了重新选举后的主节点(slave1)的端口,并且status也还是表示正常
-
测试写入
我们可以连接新的主节点查看是否可以正常写入,然后在通过info Replication
查看节点信息,是否都正常
-
测试读取
- slave2节点读取
连接上slave2号节点,我们可以看到主节点的信息变为了6480,新的主节点的信息,并且数据可以正常读取到
- master节点读取
我们可以通过docker start redis-master
在启动master节点,可以看到数据也是直接同步过来了
- slave2节点读取
-
监听日志
在redis-sentinel目录下的docker-compose文件位置执行docker-compose logs
查看哨兵节点的日志可以查看具体刚刚执行的流程的不同阶段信息
二、spring连接
1、添加依赖
加入对应的redis依赖
gradle依赖,maven改为对应的写法即可,我的spring boot版本是3.3.5,不同版本可能yml中的配置会有一点区别
implementation("org.springframework.boot:spring-boot-starter-data-redis")implementation("com.fasterxml.jackson.core:jackson-databind")
2、添加配置
编写的配置文件的这个就是sentinel的master
哨兵模式方式连接redis,我们只需要配置哨兵的连接即可,不需要去配置具体的redis节点信息
具体编写
spring:data:redis:#密码password: 123456timeout: 5000sentinel:#对应前面sentinel的配置文件信息master: mymaster#三个哨兵的ip端口nodes: 192.168.31.121:26379,192.168.31.121:36379,192.168.31.121:46379
3、启动测试
可以
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.data.redis.core.RedisTemplate@SpringBootTest
class PayDomainApplicationTests {@Autowiredprivate lateinit var redisTemplate: RedisTemplate<String, Any>@Testfun set() {val set = redisTemplate.opsForValue().set("spring", "test")println("写入成功====>$set")}@Testfun get() {val get = redisTemplate.opsForValue().get("spring")println("读取成功====>$get")}}
可以实现正常读取,表示没问题
三、直接部署流程
1、拉取配置
先把我的仓库的配置添加到指定位置
仓库地址===>🍅https://github.com/AACS111/redis-sentinel
2、修改端口创建
如果不想直接一步一步搭建也可以直接把我配置好上次github仓库的直接拉取下来,通过全局搜索,搜索192.168.192.12
,把我的IP改为自己docker安装的宿主机的P即可。
然后先在master-slave
,再在sentinel
目录下分别执行docker-compose up -d
创建容器集群即可!
相关文章:
【2024】使用Docker搭建redis sentinel哨兵模式集群全流程(包含部署、测试、错误点指正以及直接部署)
目录💻 前言**Docker Compose介绍**最终实现效果 一、搭建集群1、创建文件结构2、创建redis节点3、验证节点4、创建sentinel哨兵5、验证Sentinel功能 二、spring连接1、添加依赖2、添加配置3、启动测试 三、直接部署流程1、拉取配置2、修改端口创建 前言 本篇文章主…...
Spring WebFlux与Spring MVC
Spring WebFlux 是对 Spring Boot 项目中传统 Spring MVC 部分的一种替代选择,主要是为了解决现代 Web 应用在高并发和低延迟场景下的性能瓶颈。 1.WebFlux 是对 Spring MVC 的替代 架构替代: Spring MVC 使用的是基于 Servlet 规范的阻塞式模型…...
江协科技最新OLED保姆级移植hal库
江协科技最新OLED移植到hal库保姆级步骤 源码工程存档 工程和源码下载(密码 1i8y) 原因 江协科技的开源OLED封装的非常完美, 可以满足我们日常的大部分开发, 如果可以用在hal库 ,将是如虎添翼, 为我们开发调试又增加一个新的瑞士军刀, 所以我们接下来手把手的去官网移植源码…...
Vue框架开发一个简单的购物车(Vue.js)
让我们利用所学知识来开发一个简单的购物车 (记得暴露属性和方法!!!) 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…...
探索嵌入式硬件设计:揭秘智能设备的心脏
目录 引言 嵌入式系统简介 嵌入式硬件设计的组成部分 设计流程 微控制器选择 原理图设计 PCB布局 编程与调试 系统集成与测试 深入理解微控制器 存储器管理 输入/输出接口 通信接口 电源管理 硬件抽象层(HAL) 操作系统(OS&am…...
逆向攻防世界CTF系列42-reverse_re3
逆向攻防世界CTF系列42-reverse_re3 参考:CTF-reverse-reverse_re3(全网最详细wp,超4000字有效解析)_ctfreverse题目-CSDN博客 64位无壳 _int64 __fastcall main(__int64 a1, char **a2, char **a3) {int v4; // [rsp4h] [rbp-…...
AIGC时代 | 如何从零开始学网页设计及3D编程
文章目录 一、网页设计入门1. 基础知识2. 学习平台与资源3. 示例代码:简单的HTMLCSSJavaScript网页 二、3D编程入门1. 基础知识2. 学习平台与资源3. 示例代码:简单的Unity 3D游戏 《编程真好玩:从零开始学网页设计及3D编程》内容简介作者简介…...
EMall实践DDD模拟电商系统总结
目录 一、事件风暴 二、系统用例 三、领域上下文 四、架构设计 (一)六边形架构 (二)系统分层 五、系统实现 (一)项目结构 (二)提交订单功能实现 (三࿰…...
基于多VSG独立微网的多目标二次控制MATLAB仿真模型
“电气仔推送”获得资料(专享优惠) 模型简介 本文将一致性算法引入微电网的二次频率和电压控制,自适应调节功率参考值和补偿电压,同时实现频率电压恢复、有功 无功功率的比例均分以及功率振荡抑制,提高系统的暂态和稳…...
自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析
前言:公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值,我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一:开头加一条环境变量,执行脚本后,提示输入:需要查询的命名空间,…...
nginx 代理 web service 提供 soap + xml 服务
nginx 代理 web service 提供 soap xml 服务 最关键的配置: # Nginx默认反向后的端口为80,因此存在被代理后的端口为80的问题,这就导致访问出错。主要原因在Nginx的配置文件的host配置时没有设置响应的端口。Host配置只有host,没有对应的p…...
深入理解 MongoDB:一款灵活高效的 NoSQL 数据库
在现代应用程序开发中,数据存储技术已经从传统的关系型数据库(RDBMS)扩展到多样化的 NoSQL 数据库。MongoDB 作为一款广泛使用的文档型数据库,以其灵活性、高性能和易用性成为开发者的首选之一。本篇博文将从 MongoDB 的核心概念、…...
vue3 + vite + antdv 项目中自定义图标
前言: 去iconfont-阿里巴巴矢量图标库 下载自己需要的icon图标,下载格式为svg;项目中在存放静态资源的文件夹下 assets 创建一个存放svg格式的图片的文件夹。 步骤: 1、安装vite-plugin-svg-icons npm i vite-plugin-svg-icons …...
PDF版地形图矢量出现的问题
项目描述:已建风电场道路测绘项目,收集到的数据为PDF版本的地形图,图上标注了项目竣工时期的现状,之后项目对施工区域进行了复垦恢复地貌,现阶段需要准确的知道实际复垦修复之后的道路及其它临时用地的面积 解决方法&…...
JavaScript 高级教程:异步编程、面向对象与性能优化
在前两篇教程中,我们学习了 JavaScript 的基础和进阶内容。这篇文章将带领你进入更深层次,学习 JavaScript 的异步编程模型、面向对象编程(OOP),以及性能优化的技巧。这些内容对于构建复杂、流畅的前端应用至关重要。 …...
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。-多语言
目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移…...
OCR实现微信截图改名
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple/ ──(Sat,Nov30)─┘ pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install paddleo…...
c++stl模板总结
stl 总结stl模板vectordequelistforward_liststl集合类set&unorder_setmap&unorder_map 自适应容器栈和队列stackqueuepriority_queue 总结stl模板 vector 1.初始化 vector具有多个重载的构造函数,可以在实例化vector时指定他开始时应该包含的元素个数以…...
文本生成类(机器翻译)系统评估
在机器翻译任务中常用评价指标:BLEU、ROGUE、METEOR、PPL。 这些指标的缺点:只能反应模型输出是否类似于测试文本。 BLUE(Bilingual Evaluation Understudy):是用于评估模型生成的句子(candidate)和实际句子(referen…...
Harmony NEXT-越过相机读写权限上传图片至项目云存储中
问题成因 在制作用户注册登录界面时想要实现用户头像上传共能,查询API文档,发现有picker和PhotoAccessHelper两个包可以选择使用,但是在使用PhotoAccessHelper包拉起相册并读入所选的照片后将该照片传入云存储中产生报错,需要相册…...
C++算法练习-day53——17.电话号码的字母组合
题目来源:. - 力扣(LeetCode) 题目思路分析 题目要求我们将一个数字字符串(每个数字对应一组字母,如2对应abc,3对应def等)转换成所有可能的字母组合。这是一个典型的组合生成问题,…...
计算机网络性能
任何一个系统都可以或需要不同的指标来度量系统的优劣、状态或特性。计算机网络是综合计算机技术与通信技术的复杂系统,可以通过许多指标对一个计算机网络的整体或局部、全面或部分、静态或动态等不同方面的性能进行度量与评价 1、传输时延 当一个分组在输出链路发…...
MAC卸载Vmware Fusion后无法再安装解决方案
MAC卸载Vmware Fusion后无法再安装解决方案 执行脚本 sudo rm -rf /Library/Application Support/VMware/VMware Fusion sudo rm -rf /Library/Application Support/VMware/Usbarb.rules sudo rm -rf /Library/Application Support/VMware Fusion sudo rm -rf /Library/Prefe…...
windows 服务器角色
windows 服务器角色 Active Directory Rights Management Services Active Directory RightsManagement Services (AD RS)帮助保护信息,防止未授权使用。AD RMS 将建立用户标识,并为授权用户提供受保护信息的许可证。 ServicesActive Directory 联合身…...
NAT学习手册
NAT(Network Address Translation,网络地址转换)是一种在局域网(LAN)内部使用私有地址,而在连接到互联网时将这些私有地址转换为全球唯一且有效的公网地址的技术。这种技术的主要目的是解决IPv4地址空间不足…...
python -从文件夹批量提取pdf文章的第n页,并存储起来
python -从文件夹批量提取pdf文章的第n页,并存储起来 废话不多说,看下面代码 讲解一下下面代码 reader PyPDF2.PdfReader (file) 将文件转化为PdfReader 对象,方便使用内置方法。 first_page reader.pages[0] 提取第一页 writer PyPDF…...
RPC中定时器制作思路
定时器设计 time_event time_event 类用来封装定时时间,内部需要包含一个任务执行时间,是否重复标记、是否取消标记,对于重复任务,还需要一个重复间隔时间。以及一个回调函数,用来执行任务到期后需要执行的动作。 构…...
Flutter简单实现滑块验证
现在实现一个 Flutter 滑动验证组件,类似于许多网站和应用程序中常见的“滑动以验证”功能。它通过滑动一个滑块来完成验证操作,用户需要将滑块拖动到指定位置以完成验证。 前置知识点整理 StatefulWidget 在 Flutter 中,StatefulWidget 是…...
第33周:运动鞋识别(Tensorflow实战第五周)
目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 1.3 查看数据 二、数据预处理 2.1 加载数据 2.2 可视化数据 2.3 再次检查数据 2.4 配置数据集 2.4.1 基本概念介绍 2.4.2 代码完成 三、构建CNN网络 四、训练模型 4.1 设置动态学习率 4.2 早停与保存最佳模型…...
C#中switch语句使用
编写一个程序,使用switch语句将用户输入的分数转换成等级,如表 private static void Main(string[] args) { Console.WriteLine("请输入分数:"); int score int.Parse(Console.ReadLine()); switch (score) …...
2024.11.28(作业)
思维导图 功能函数声明文件 #ifndef _FUN_H__ #define _FUN_H__ #include <myhead.h>#define MAX 50 //数组大小 #define QAZ 20 //长度和字符串大小typedef int datatype; //数据元素类型//2.1 定义顺序表类型 typedef struct {datatype data[MAX];int len; }S…...
充分统计量(Sufficient Statistic)概念与应用: 中英双语
充分统计量:概念与应用 在统计学中,充分统计量(Sufficient Statistic) 是一个核心概念。它是从样本中计算得出的函数,能够完整且无损地表征样本中与分布参数相关的信息。在参数估计中,充分统计量能够帮助我…...
2. STM32_中断
中断 中断是什么: 打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断。 中断的意义: 中断可以高效处理紧急程序,不会一直占用CPU资源。如实时控制、故障处理、处理不确定…...
CAD 文件 批量转为PDF或批量打印
CAD 文件 批量转为PDF或批量打印,还是比较稳定的 1.需要本地安装CAD软件 2.通过 Everything 搜索工具搜索,DWG To PDF.pc3 ,获取到文件目录 ,替换到代码中, originalValue ACADPref.PrinterConfigPath \ r"C:…...
明明的随机数
题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉ÿ…...
2024金盾信安杯线上赛 MISC ezpng[wp]
下载题目发现给了个password和png 图片发现损坏的 password丢随波逐流一键解 base64 给出解码的结果是 cimbar搜索发现在Github有工具 然后对附件中的图片进行小厨房xor 得到一张新图片 利用工具进行跑出答案...
C与指针。
目录 1_指针理解 1.1变量的值 1.2变量的地址 1.3指针 1.4取变量的地址 2_分析指针 2.1分析指针变量的要素 2.2根据需求定义指针变量 3_指针的使用 3.1指针对变量的读操作 3.2指针对变量的写操作 4_指针占用空间的大小与位移 4.1指针占用空间的大小 4.2指针的位移…...
使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践
使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践 在这篇博客中,我们将介绍如何利用 Selenium 和 Python 爬取腾讯新闻的内容,并将结果保存到 CSV 文件中。本教程包含以下内容: 项目简介依赖安装实现功能的代码实现中的关键技…...
ElasticSearch的下载和基本使用(通过apifox)
1.概述 一个开源的高扩展的分布式全文检索引擎,近乎实时的存储,检索数据 2.安装路径 Elasticsearch 7.8.0 | Elastic 安装后启动elasticsearch-7.8.0\bin里的elasticsearch.bat文件, 启动后就可以访问本地的es库http://localhost:9200/ …...
处理HTTP请求的两种常见方式:多个处理器(Handler)、多个处理函数(HandleFunc),两者有什么区别
一、多个处理器(Handler)、多个处理函数(HandleFunc),两者的区别: 在Go语言中,处理HTTP请求的两种常见方式是使用http.Handler接口和http.HandleFunc函数。它们都用于定义如何处理HTTP请求,但它们之间有一些关键的区别࿱…...
在oracle下载jdk显示400 Bad Request Request Header Or Cookie Too Large
下载JDK17,官网地址:【https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows】 问题: 出现 400 Bad Request: Request Header Or Cookie Too Large 错误,通常是由于浏览器存储的 Cookies 或请求头过大所导致的…...
机器学习与深度学习-2-Softmax回归从零开始实现
机器学习与深度学习-2-Softmax回归从零开始实现 1 前言 内容来源于沐神的《动手学习深度学习》课程,本篇博客对于Softmax回归从零开始实现进行重述,依旧是根据Python编程的PEP8规范,将沐神的template代码进行简单的修改。近期有点懒散哈哈哈…...
Vue3之弹窗
文章目录 第一步、引入JS第二步、弹框 在前端开发语言Vue3,在管理端如何进行弹窗?下面根据API实现效果。 Element API文档: Element-plus文档 搭建环境可参考博客【 初探Vue3环境搭建与nvm使用】 第一步、引入JS <script lang"ts&…...
计算机的错误计算(一百七十一)
摘要 探讨 MATLAB 中秦九韶(Horner)多项式的错误计算。 例1. 用秦九韶(Horner)算法计算(一百零七)例1中多项式 直接贴图吧: 这样,MATLAB 给出的仍然是错误结果,因为准…...
利用Python爬虫精准获取淘宝商品详情的深度解析
在数字化时代,数据的价值日益凸显,尤其是在电子商务领域。淘宝作为中国最大的电商平台之一,拥有海量的商品数据,对于研究市场趋势、分析消费者行为等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序,精准获取…...
_C#_串口助手_字符串拼接缺失问题(未知原理)
最近使用WPF开发串口助手时,遇到一个很奇怪的问题,无论是主线程、异步还是多线程,当串口接收速度达到0.016s一次以上,就会发生字符串缺失问题并且很卡。而0.016s就一切如常,仿佛0.015s与0.016s是天堑之隔。 同一份代码…...
volcano k8s 部署
下载volcano-development文件 官网 https://volcano.sh/zh/docs/installation/volcano-development.yaml wget https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml部署volcano 查下需要下载的镜像 grep vc- volcano-develo…...
Linux---对时/定时服务
文章目录 目录 文章目录 前言 一.对时服务 服务端配置 客户端配置 二.定时服务 单次定时任务 循环定时任务 前言 在当今信息化高速发展的时代,时间的准确性和任务的定时执行对于各种系统和服务来说至关重要。Linux操作系统,凭借其强大的功能和灵活的…...
13 设计模式之外观模式(家庭影院案例)
一、什么是外观模式? 1.定义 在日常生活中,许多人喜欢通过遥控器来控制家中的电视、音响、DVD 播放器等设备。虽然这些设备各自独立工作,但遥控器提供了一个简洁的界面,让用户可以轻松地操作多个设备。而这一设计理念正是 外观模…...
spring boot整合ArtemisMQ进行手动消息确认
1、SpringBoot整合ArtemisMQ进行手动消息确认使用的是: factory.setSessionTransacted(false); factory.setSessionAcknowledgeMode(ActiveMQJMSConstants.INDIVIDUAL_ACKNOWLEDGE); 2、SpringBoot整合ActiveMQ进行手动消息确认使用的是: factory.setSe…...