Redis哨兵模式深度解析与实战部署
Redis哨兵模式深度解析与实战部署
文章目录
- Redis哨兵模式深度解析与实战部署
- 一、Redis哨兵模式理论架构详解
- 1.1 哨兵模式的核心架构组成
- 基础架构拓扑图
- 1.2 哨兵节点的核心功能模块
- 1.2.1 监控模块(Monitoring)
- 1.2.2 决策模块(Decision Making)
- 1.2.3 故障转移模块(Failover)
- 1.3 关键配置参数解析
- 二、Redis哨兵模式实战部署指南
- 2.1 环境规划与准备
- 2.1.1 资源列表
- 2.1.2 基础环境配置(所有节点执行)
- 2.2 部署Redis主从集群
- 2.2.1 安装Redis服务(主从节点执行)
- 2.2.2 主节点配置(master节点)
- 2.2.3 从节点配置(slave01/slave02节点)
- 2.3 部署哨兵集群
- 2.3.1 安装哨兵服务(所有哨兵节点执行)
- 2.3.2 哨兵节点配置(以sentinel01为例,sentinel02/sentinel03仅IP不同)
- 2.4 哨兵集群完整配置文件示例
- 哨兵配置文件(sentinel.conf)完整内容:
- 2.5 故障转移实战演练
- 2.5.1 模拟主节点故障
- 2.5.2 验证新主节点状态
- 2.5.3 原主节点恢复后状态
- 三、哨兵模式运维与优化建议
- 3.1 核心参数调优策略
- 3.2 监控与告警配置建议
- 3.2.1 关键监控指标
- 3.2.2 告警规则设置
- 3.3 生产环境最佳实践
- 四、总结
- 四、总结
一、Redis哨兵模式理论架构详解
1.1 哨兵模式的核心架构组成
Redis哨兵模式(Sentinel)是一种分布式高可用解决方案,其架构由两大核心部分构成:
-
哨兵节点(Sentinel Nodes):
- 特殊的Redis节点,不存储数据,仅负责监控与决策
- 通常部署为多节点集群(建议至少3个节点),避免单点故障
- 节点间通过流言协议(Gossip)交换状态信息
-
数据节点(Data Nodes):
- 包括主节点(Master)和从节点(Slave)
- 主节点负责读写操作,从节点提供数据冗余和读服务
- 主从节点通过复制(Replication)机制保持数据一致
基础架构拓扑图
+----------------+| Sentinel 1 |+--------+-------+|+--------+-------+| Sentinel 2 |+--------+-------+|+--------+-------+| Sentinel 3 |+--------+-------+|+---------------------+---------------------+| |
+---------v---------+ +---------v---------+ +---------v---------+
| Master (M) | | Slave 1 (R1) | | Slave 2 (R2) |
| IP: 192.168.1.10 | | IP: 192.168.1.11 | | IP: 192.168.1.12 |
| Port: 6379 | | Port: 6379 | | Port: 6379 |
+-------------------+ +-------------------+ +-------------------+
1.2 哨兵节点的核心功能模块
1.2.1 监控模块(Monitoring)
- 三大定时任务:
- 每10秒:向主从节点发送
INFO
命令,获取复制状态与从节点列表 - 每2秒:通过主节点的
__sentinel__:hello
频道发布自身状态,与其他哨兵节点交换信息 - 每1秒:向所有主从节点及哨兵节点发送
PING
命令,检测节点存活状态
- 每10秒:向主从节点发送
1.2.2 决策模块(Decision Making)
-
主观下线(SDOWN, Subjective Down):
- 单个哨兵节点发现目标节点超过
down-after-milliseconds
时间未响应PING
,判定为SDOWN - 仅针对主节点会触发后续客观下线流程,从节点和哨兵节点SDOWN后无后续操作
- 单个哨兵节点发现目标节点超过
-
客观下线(ODOWN, Objective Down):
- 当监控同一主节点的哨兵中,超过
quorum
数量的节点认为主节点SDOWN,判定为ODOWN - 仅主节点存在ODOWN状态,是故障转移的前提条件
- 当监控同一主节点的哨兵中,超过
1.2.3 故障转移模块(Failover)
-
领导者哨兵选举:
- 采用Raft算法的简化版,满足"超过半数节点投票"原则
- 选举过程:
- 发现主节点ODOWN的哨兵节点向其他哨兵发送选举请求
- 其他哨兵节点首次接收到请求时投票
- 获得超过半数+
quorum
投票的哨兵成为领导者 - 选举冲突时等待随机延时后重试
-
新主节点选举:
- 领导者哨兵按以下优先级筛选新主:
- 过滤掉不健康(连接失败/响应超时)的从节点
- 选择
slave-priority
最高的从节点(值越小优先级越高,默认100) - 优先级相同则选择复制偏移量(replication offset)最大的从节点
- 偏移量相同则选择RunID最小的从节点
- 领导者哨兵按以下优先级筛选新主:
-
状态更新流程:
- 新主节点执行
SLAVEOF NO ONE
脱离从节点身份 - 其他从节点执行
SLAVEOF new_master_ip new_master_port
指向新主 - 故障主节点恢复后自动成为新主的从节点
- 新主节点执行
1.3 关键配置参数解析
参数名称 | 配置位置 | 作用描述 | 典型值 |
---|---|---|---|
sentinel monitor | 哨兵配置文件 | 定义监控的主节点信息,格式为master-name ip port quorum | sentinel monitor mymaster 192.168.1.10 6379 2 |
down-after-milliseconds | 主从/哨兵配置文件 | 判定节点主观下线的超时时间(毫秒) | 30000(30秒) |
failover-timeout | 哨兵配置文件 | 故障转移的最大超时时间,通常为down-after-milliseconds 的10倍 | 180000(3分钟) |
parallel-syncs | 哨兵配置文件 | 故障转移时从节点并行同步新主的最大数量,降低主节点负载 | 1 |
slave-priority | 从节点配置文件 | 从节点优先级,值越小优先级越高,0表示不参与主节点选举 | 100 |
二、Redis哨兵模式实战部署指南
2.1 环境规划与准备
2.1.1 资源列表
节点角色 | 操作系统 | 配置 | IP地址 | 主机名 | 端口 |
---|---|---|---|---|---|
主节点 | OpenEuler 24 | 2C4G | 192.168.207.140 | master | 6379 |
从节点1 | OpenEuler 24 | 2C4G | 192.168.207.141 | slave01 | 6379 |
从节点2 | OpenEuler 24 | 2C4G | 192.168.207.142 | slave02 | 6379 |
哨兵节点1 | OpenEuler 24 | 2C4G | 192.168.207.137 | sentinel01 | 26379 |
哨兵节点2 | OpenEuler 24 | 2C4G | 192.168.207.138 | sentinel02 | 26379 |
哨兵节点3 | OpenEuler 24 | 2C4G | 192.168.207.139 | sentinel03 | 26379 |
2.1.2 基础环境配置(所有节点执行)
# 1. 关闭防火墙(避免端口访问限制)
systemctl stop firewalld # 停止防火墙服务
systemctl disable firewalld # 禁止防火墙开机自启# 2. 关闭SELinux(避免安全策略干扰)
setenforce 0 # 临时关闭SELinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config # 永久关闭# 3. 修改主机名(根据节点角色设置)
# 在master节点执行:
hostnamectl set-hostname master
# 在slave01节点执行:
hostnamectl set-hostname slave01
# 在slave02节点执行:
hostnamectl set-hostname slave02
# 在sentinel01节点执行:
hostnamectl set-hostname sentinel01
# 在sentinel02节点执行:
hostnamectl set-hostname sentinel02
# 在sentinel03节点执行:
hostnamectl set-hostname sentinel03# 4. 刷新主机名配置
exec bash
2.2 部署Redis主从集群
2.2.1 安装Redis服务(主从节点执行)
# 1. 安装编译依赖
dnf -y install gcc gcc-c++ make tar# 2. 解压Redis源码包(假设下载的是redis-6.2.4.tar.gz)
tar -zxvf redis-6.2.4.tar.gz -C /usr/src/# 3. 编译并安装Redis(指定安装路径)
cd /usr/src/redis-6.2.4/
make && make PREFIX=/usr/local/redis install # PREFIX指定安装目录# 4. 创建软链接方便调用
ln -s /usr/local/redis/bin/* /usr/local/bin/# 5. 创建配置文件目录
mkdir /etc/redis
2.2.2 主节点配置(master节点)
# 1. 复制默认配置文件
cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf# 2. 编辑主节点配置文件
vim /etc/redis/6379.conf
# 以下为关键配置项(行号为Redis 6.2默认配置位置):
bind 127.0.0.1 192.168.207.140 # 75行,监听本地回环地址和节点IP,允许远程访问
port 6379 # 98行,Redis服务端口
daemonize yes # 257行,以守护进程方式运行
pidfile /var/run/redis_6379.pid # 289行,PID文件路径
loglevel notice # 297行,日志级别(notice为普通日志)
logfile "/var/log/redis_6379.log" # 302行,日志文件路径
requirepass redis123 # 新增,设置访问密码(生产环境建议设置)# 3. 创建系统服务脚本
cat > /etc/systemd/system/redis.service << 'EOF'
[Unit]
Description=Redis Database Server
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF# 4. 启动服务并设置开机自启
systemctl daemon-reload
systemctl start redis
systemctl enable redis# 5. 验证服务启动
netstat -anpt | grep 6379
# 输出示例:tcp 0 0 192.168.207.140:6379 0.0.0.0:* LISTEN
2.2.3 从节点配置(slave01/slave02节点)
# 1. 复制默认配置文件(与主节点相同步骤)
cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf# 2. 编辑从节点配置文件(以slave01为例)
vim /etc/redis/6379.conf
# 关键配置项(在主节点配置基础上修改):
bind 127.0.0.1 192.168.207.141 # 75行,修改为从节点IP
port 6379 # 98行,端口保持一致
daemonize yes # 257行,守护进程模式
pidfile /var/run/redis_6379.pid # 289行,PID文件路径
loglevel notice # 297行,日志级别
logfile "/var/log/redis_6379.log" # 302行,日志文件路径
requirepass redis123 # 与主节点密码一致
replicaof 192.168.207.140 6379 # 新增,指定主节点IP和端口(Redis 6.2+使用replicaof替代slaveof)
slave-priority 100 # 新增,从节点优先级(默认100,值越小优先级越高)# 3. 创建系统服务脚本(与主节点相同)
cat > /etc/systemd/system/redis.service << 'EOF'
[Unit]
Description=Redis Database Server
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF# 4. 启动服务并设置开机自启
systemctl daemon-reload
systemctl start redis
systemctl enable redis# 5. 验证主从复制状态
# 在主节点执行:
redis-cli -h 192.168.207.140 -p 6379 -a redis123
127.0.0.1:6379> info replication
# 输出应包含:
# role:master
# connected_slaves:2
# slave0:ip=192.168.207.141,port=6379,...
# slave1:ip=192.168.207.142,port=6379,...# 在从节点执行:
redis-cli -h 192.168.207.141 -p 6379 -a redis123
127.0.0.1:6379> info replication
# 输出应包含:
# role:slave
# master_host:192.168.207.140
# master_port:6379
# master_link_status:up
2.3 部署哨兵集群
2.3.1 安装哨兵服务(所有哨兵节点执行)
# 1. 安装编译依赖(与Redis主从节点相同)
dnf -y install gcc gcc-c++ make tar# 2. 解压Redis源码包(使用与主从相同的源码包)
tar -zxvf redis-6.2.4.tar.gz -C /usr/src/# 3. 编译并安装Redis(哨兵本质是特殊的Redis节点)
cd /usr/src/redis-6.2.4/
make && make install # 无需指定PREFIX,默认安装到/usr/local/bin# 4. 创建配置文件目录
mkdir /etc/redis
2.3.2 哨兵节点配置(以sentinel01为例,sentinel02/sentinel03仅IP不同)
# 1. 复制默认配置文件
cp /usr/src/redis-6.2.4/redis.conf /etc/redis/sentinel.conf# 2. 编辑哨兵配置文件
vim /etc/redis/sentinel.conf
# 关键配置项(注释为配置说明):
port 26379 # 哨兵服务端口,默认26379,与Redis数据端口区分
bind 0.0.0.0 # 监听所有网络接口,允许其他哨兵节点连接
daemonize yes # 以守护进程方式运行
pidfile /var/run/redis-sentinel-26379.pid # 哨兵PID文件
loglevel notice # 日志级别
logfile "/var/log/redis-sentinel.log" # 哨兵日志文件
dir "/tmp" # 持久化文件存储目录(哨兵不存储数据,可设为临时目录)
sentinel monitor mymaster 192.168.207.140 6379 2 # 监控主节点,quorum=2表示至少2个哨兵同意才判定主节点故障
sentinel down-after-milliseconds mymaster 30000 # 主节点30秒未响应判定为SDOWN
sentinel failover-timeout mymaster 180000 # 故障转移超时时间180秒
sentinel parallel-syncs mymaster 1 # 故障转移时从节点并行同步数量1# 3. 创建系统服务脚本
cat > /etc/systemd/system/redis-sentinel.service << 'EOF'
[Unit]
Description=Redis Sentinel Server
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/sentinel.conf
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 26379 shutdown
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF# 4. 启动哨兵服务并设置开机自启
systemctl daemon-reload
systemctl start redis-sentinel
systemctl enable redis-sentinel# 5. 验证哨兵启动
ps -aux | grep redis-sentinel
# 输出示例:root 12345 0.5 0.3 165064 9232 ? Ssl 10:00 0:01 /usr/local/bin/redis-sentinel *:26379 [sentinel]# 6. 查看哨兵状态
redis-cli -p 26379
127.0.0.1:26379> info sentinel
# 输出应包含:
# sentinel_masters:1
# master0:name=mymaster,status=ok,address=192.168.207.140:6379,slaves=2,sentinels=3
2.4 哨兵集群完整配置文件示例
哨兵配置文件(sentinel.conf)完整内容:
# 基本设置
port 26379 # 哨兵服务端口,默认26379
bind 0.0.0.0 # 监听所有IP,允许远程访问
daemonize yes # 守护进程模式
pidfile "/var/run/redis-sentinel-26379.pid" # PID文件路径
loglevel notice # 日志级别
logfile "/var/log/redis-sentinel.log" # 日志文件
dir "/tmp" # 工作目录,哨兵不存储数据,可设为临时目录# 监控配置
sentinel monitor mymaster 192.168.207.140 6379 2 # 监控主节点,quorum=2
sentinel down-after-milliseconds mymaster 30000 # 30秒未响应判定为SDOWN
sentinel failover-timeout mymaster 180000 # 故障转移超时时间180秒
sentinel parallel-syncs mymaster 1 # 故障转移时1个从节点并行同步# 安全设置(生产环境建议启用)
# requirepass sentinel123 # 哨兵认证密码
# masterauth redis123 # 连接主节点的密码
2.5 故障转移实战演练
2.5.1 模拟主节点故障
# 1. 在主节点停止Redis服务
systemctl stop redis# 2. 在哨兵节点查看状态变化(以sentinel01为例)
redis-cli -p 26379
127.0.0.1:26379> info sentinel
# 等待约30秒后,输出应显示主节点已切换:
# master0:name=mymaster,status=ok,address=192.168.207.141:6379,slaves=2,sentinels=3
# (假设slave01被选为新主,IP为192.168.207.141)
2.5.2 验证新主节点状态
# 1. 在新主节点(假设为slave01)查看角色
redis-cli -h 192.168.207.141 -p 6379 -a redis123
127.0.0.1:6379> info replication
# 输出应显示:
# role:master
# connected_slaves:1 # 原slave02成为新主的从节点# 2. 在原从节点slave02查看主节点信息
redis-cli -h 192.168.207.142 -p 6379 -a redis123
127.0.0.1:6379> info replication
# 输出应显示:
# role:slave
# master_host:192.168.207.141 # 指向新主节点
2.5.3 原主节点恢复后状态
# 1. 在原主节点(master)重启Redis服务
systemctl start redis# 2. 查看原主节点角色
redis-cli -h 192.168.207.140 -p 6379 -a redis123
127.0.0.1:6379> info replication
# 输出应显示:
# role:slave
# master_host:192.168.207.141 # 自动成为新主的从节点
三、哨兵模式运维与优化建议
3.1 核心参数调优策略
参数 | 优化场景 | 调整建议 |
---|---|---|
quorum | 多机房部署 | 设置为(哨兵节点数/2)+1 ,确保跨机房选举一致性 |
down-after-milliseconds | 高网络延迟环境 | 调整为(网络RTT*2)+5000 毫秒,避免误判 |
failover-timeout | 大数据量主从同步 | 设置为(数据集大小/网络带宽)*2 秒,确保同步完成 |
parallel-syncs | 高并发场景 | 降低为1,避免新主节点带宽耗尽 |
slave-priority | 人工指定优先级 | 将性能更好的从节点设置为更低优先级(如50) |
3.2 监控与告警配置建议
3.2.1 关键监控指标
- 哨兵状态:
sentinel_master_status
(主节点状态)、sentinel_leader_epoch
(选举纪元) - 节点健康:
redis_instance_status
(节点存活状态)、redis_master_link_status
(主从连接状态) - 复制延迟:
redis_repl_backlog_histlen
(复制积压缓冲区长度)、redis_slave_lag
(从节点延迟)
3.2.2 告警规则设置
- 主节点主观下线:单个哨兵检测到主节点SDOWN时触发预警
- 主节点客观下线:超过
quorum
数量哨兵判定主节点ODOWN时触发紧急告警 - 故障转移超时:超过
failover-timeout
未完成切换时触发告警 - 哨兵节点失联:超过
down-after-milliseconds
时间未收到哨兵心跳时触发告警
3.3 生产环境最佳实践
-
哨兵节点部署:
- 至少部署3个哨兵节点,且分布在不同物理机/机房
- 哨兵节点配置与数据节点分离,避免资源竞争
-
容灾演练:
- 每季度进行一次主节点故障转移演练
- 模拟网络分区场景,验证哨兵选举的正确性
-
配置备份:
- 定期备份Redis主从配置与哨兵配置
- 配置文件中记录当前架构拓扑与负责人信息
-
安全加固:
- 启用
requirepass
认证,避免未授权访问 - 限制哨兵节点的网络访问权限,仅允许内部通信
- 启用
四、总结
Redis哨兵模式通过分布式监控架构与自动化故障转移机制,为Redis主从集群提供了高可用保障。其核心价值在于:
- 自动化容灾:无需人工干预即可完成主节点故障检测与切换,恢复时间通常在秒级
- 分布式决策:多哨兵节点协作避免单点误判,基于Raft算法的选举机制保证决策一致性
- 无缝兼容:与原生Redis主从架构兼容,无需修改业务代码即可部署
- 轻量级设计:哨兵节点资源消耗低,适合各种规模的集群部署
竞争
-
容灾演练:
- 每季度进行一次主节点故障转移演练
- 模拟网络分区场景,验证哨兵选举的正确性
-
配置备份:
- 定期备份Redis主从配置与哨兵配置
- 配置文件中记录当前架构拓扑与负责人信息
-
安全加固:
- 启用
requirepass
认证,避免未授权访问 - 限制哨兵节点的网络访问权限,仅允许内部通信
- 启用
四、总结
Redis哨兵模式通过分布式监控架构与自动化故障转移机制,为Redis主从集群提供了高可用保障。其核心价值在于:
- 自动化容灾:无需人工干预即可完成主节点故障检测与切换,恢复时间通常在秒级
- 分布式决策:多哨兵节点协作避免单点误判,基于Raft算法的选举机制保证决策一致性
- 无缝兼容:与原生Redis主从架构兼容,无需修改业务代码即可部署
- 轻量级设计:哨兵节点资源消耗低,适合各种规模的集群部署
在实际应用中,合理的架构设计、参数调优与定期演练是保障哨兵模式稳定运行的关键。对于高可用性要求极高的场景,结合哨兵模式与Redis Cluster可进一步提升系统容灾能力,为核心业务提供更坚实的数据访问保障。
相关文章:
Redis哨兵模式深度解析与实战部署
Redis哨兵模式深度解析与实战部署 文章目录 Redis哨兵模式深度解析与实战部署一、Redis哨兵模式理论架构详解1.1 哨兵模式的核心架构组成基础架构拓扑图 1.2 哨兵节点的核心功能模块1.2.1 监控模块(Monitoring)1.2.2 决策模块(Decision Makin…...
【软考高级系统架构论文】论边缘计算及其应用
论文真题 边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的分布式开放平台(架构),就近提供边缘智能服务。边缘计算与云计算各有所长,云计算擅长全局性、非实时、长周期的大数据处理与分析,能够在长周期维护、业务决策支撑等领域发挥优势;…...
触摸屏(典型 I2C + Input 子系统设备)从设备树解析到触摸事件上报
触摸屏(典型 I2C Input 子系统设备)从设备树解析到触摸事件上报 以下是架构图,对触摸屏(典型I2C Input子系统设备)从设备树解析到触摸事件上报的全流程详细拆解,包含文字讲解和配套流程图: 注…...
Java中==与equals()方法的深度解析
作为Java后端开发者,我们经常会遇到需要比较两个对象是否相等的情况。在Java中,运算符和equals()方法都可以用于比较,但它们之间存在着本质的区别。 1. 运算符 是一个比较运算符,它的行为取决于比较的类型: 1.1 比较…...
qt常用控件--02
文章目录 qt常用控件--02toolTip属性focusPolicy属性styleSheet属性补充知识点按钮类控件QPushButton 结语 很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 今天我们进一步c11中常见的新增表达 作者&…...
AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一)
环境: AI-Sphere-Butler VBCABLE2.1.58 Win10专业版 豆包桌面版1.47.4 ubuntu22.04 英伟达4070ti 12G python3.10 问题描述: AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一) 聊天视频: AI真…...
为什么android要使用Binder机制
1.linux中大多数标准 IPC 场景(如管道、消息队列、ioctl 等)的进程间通信机制 ------------------ ------------------ ------------------ | 用户进程 A | | 内核空间 | | 用户进程 B | | (User Spa…...
Apache SeaTunnel Flink引擎执行流程源码分析
目录 1. 任务启动入口 2. 任务执行命令类:FlinkTaskExecuteCommand 3. FlinkExecution的创建与初始化 3.1 核心组件初始化 3.2 关键对象说明 4. 任务执行:FlinkExecution.execute() 5. Source处理流程 5.1 插件初始化 5.2 数据流生成 6. Transform处理流程 6.1 插…...
XML读取和设置例子
在Qt C中,可以使用Qt的 QDomDocument类来读取、更新和保存XML文件。这个类提供了对XML文档的强大操作能力,支持通过DOM(文档对象模型)对XML进行读取、修改、添加和删除节点等操作。 下面是一个详细的例子,演示如何在Qt…...
数据标注师学习内容
目录 文本标注词性标注实体标注 图像标注语音标注 文本标注 词性标注 第一篇 第二篇 实体标注 点击这里 关系标注 事件标注 意图标注 关键词标注 分类标注 问答标注 对话标注 图像标注 拉框标注 关键点标注 2D标注 3D标注 线标注 目标跟踪标注 OCR标注 图像分类标注 语音…...
如何实现财务自由
如果有人告诉你,普通人也可以在5到10年内,而不是40到50年后实现财务自由、彻底退休,你会不会觉得对方在开玩笑?但这并非天方夜谭,《百万富翁快车道》的作者MJ德马科就是成功案例。他曾和多数人一样做底层工作ÿ…...
一些想法。。。
1.for里面的局部变量这种还是在for里面定义比较好 比如 for(int i 0;i<n;i){ int num; cin>>num; } 实不相瞒,有一次直接cin了i怎么都没看出来哪里错了。。。 2.关于long long 如果发现中间结果大约是10^9,就要考虑int 溢出 即用 long …...
基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架
基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架 摘要: 低空经济作为新兴战略产业,其核心场景(如无人机物流、城市空中交通、低空监测)普遍面临环境动态性强、个体观测受限、数据隐私敏感及多智能体协同复杂等挑战。本文创新性地提出一种深…...
github常用插件
一,文档辅助阅读系列:自动化wiki处理 1,deepwiki https://deepwiki.com/ 将我们看不懂的官方code文档转换为wiki,更加便于理解。 其实能够翻阅的仓库很有限,比如说: 但是有很多仓库并没有indexÿ…...
python3字典
1 字典简介 字典是一种可变容器模型,且可存储任意类型对象。字典每个基本元素都包括两个部分: 键(key)和键对应的值(value) 每个键值 key>value 对用冒号: 分割,每个对之间用逗号(,)分割&am…...
华为云 Flexus+DeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践
华为云 FlexusDeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践 前言背景 企业财务处理中,增值税发票信息手动提取存在效率低、易出错等痛点,华为云 Flexus 弹性算力联合 DeepSeek 大模型,通过…...
[特殊字符] OpenCV opencv_world 模块作用及编译实践完整指南
📌 什么是 opencv_world 模块? opencv_world 是 OpenCV 官方提供的一个 大型集成动态库。它将 OpenCV 所有启用的模块(例如 core, imgproc, highgui, videoio, dnn, photo 等)打包到一个单一的动态库文件(如 Linux 的…...
目标检测之YOLOv5到YOLOv11——从架构设计和损失函数的变化分析
YOLO(You Only Look Once)系列作为实时目标检测领域的标杆性框架,自2016年YOLOv1问世以来,已历经十余年迭代。本文将聚焦YOLOv5(2020年发布)到YOLOv11(2024年前后)的核心技术演进&am…...
Java的SpringAI+Deepseek大模型实战【二】
文章目录 背景交互方式1、等待式问答2、流式问答 设置角色环绕增强1)修改controller2)修改配置日志级别 处理跨域 背景 上篇【Java的SpringAIDeepseek大模型实战【一】】搭建起浏览器交互的环境,如何进行流式问答,控制台打印日志…...
OpenCV——霍夫变换
霍夫变换 一、霍夫变换原理二、霍夫线检测2.1、标准霍夫变换2.2、概率霍夫变换 三、霍夫圆检测3.1、霍夫圆检测的原理3.2、霍夫梯度法 一、霍夫变换原理 霍夫变换(Hough TRansform)是从图像中识别几何图形的基本方法,由Paul Hough于1962年提…...
线程池 JMM 内存模型
线程池 & JMM 内存模型 文章目录 线程池 & JMM 内存模型线程池线程池的创建ThreadPoolExecutor 七大参数饱和策略ExecutorService 提交线程任务对象执行的方法:ExecutorService 关闭线程池的方法:线程池最大线程数如何确定? volatile…...
PillarNet: Real-Time and High-PerformancePillar-based 3D Object Detection
ECCV 2022 paper:[2205.07403] PillarNet: Real-Time and High-Performance Pillar-based 3D Object Detection code:https://github.com/VISION-SJTU/PillarNet-LTS 纯点云基于pillar3D检测模型 网络比较 SECOND 基于vo…...
配电抢修场景案例
以配电抢修场景为例来展示关键业务活动。配电抢修愿景分成业务逻辑、业务活动、业务特征、技术支撑、KPI五个层次,分别从策略、执行、评价、资源、协同5个方面描述配电抢修愿景的关键业务活动。...
H5新增属性
✅ 一、表单相关新增属性(Form Attributes) 这些属性增强了表单功能,提升用户体验和前端验证能力。 1. placeholder 描述:在输入框为空时显示提示文本。示例: <input type"text" placeholder"请输…...
C# Task 模式实现 Demo(含运行、暂停、结束状态)
下面是一个完整的 C# Task 实现示例,包含运行(Running)、暂停(Paused)和结束(Completed)状态控制: 1. 基本实现(使用 CancellationToken 控制) using System; using System.Threading; using System.Threading.Tasks;public cla…...
Docker健康检查
目录 1.命令 2.验证 1.命令 docker run -itd --name nginx -v data:/etc/nginx/ -v log:/var/log/ -p 8080:80 \ --health-cmd"curl http://127.0.0.1:80" \ --health-interval30s \ --health-timeout5s \ --health-retries3 \ --health-start-period18s \ nginx:…...
Linux笔记---线程控制
1. 线程创建:pthread_create() pthread_create() 是 POSIX 线程库(pthread)中用于创建新线程的函数。调用该函数后系统就会启动一个与主线程并发的线程,并使其跳转到入口函数处执行。 #include <pthread.h>int pthread_cr…...
【AI论文】扩展大型语言模型(LLM)智能体在测试时的计算量
摘要:扩展测试时的计算量在提升大型语言模型(LLMs)的推理能力方面已展现出显著成效。在本研究中,我们首次系统地探索了将测试时扩展方法应用于语言智能体,并研究了该方法在多大程度上能提高其有效性。具体而言…...
Spring--IOC容器的一些扩展属性
一、BeanFactoryPostProcessor和BeanPostProcessor BeanFactoryPostProcessor的作用是在实例化前修改BeanDefinition的属性 BeanPostProcessor的作用是在bean完成创建实例、填充属性之后,初始化阶段的前后都会对bean进行操作,使用postProcessBeforeIni…...
WebClient 功能介绍,使用场景,完整使用示例演示
WebClient 功能介绍 WebClient 是 Spring 5 中引入的响应式 HTTP 客户端,用于替代已弃用的 RestTemplate,专为异步非阻塞编程设计,基于 Reactor 框架实现。其核心功能包括: 异步与非阻塞 通过 Mono 和 Flux 处理请求与响应&#…...
[Java 基础]ArrayList
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制。 ArrayList 的示意可以看 VCR:https://visualgo.net/en/array 创建 ArrayList 对象 final ArrayList<String> strings new ArrayList<>();这里创建 …...
用无人机和AI守护高原净土:高海拔自然保护区的垃圾检测新方法
这篇题为《Automatic Detection of Scattered Garbage Regions Using Small Unmanned Aerial Vehicle Low-Altitude Remote Sensing Images for High-Altitude Natural Reserve Environmental Protection》的论文,发表于 Environmental Science & Technology&am…...
《Redis高并发优化策略与规范清单:从开发到运维的全流程指南》
Redis高并发优化策略与规范清单:从开发到运维的全流程指南 在互联网应用的后端架构中,Redis凭借其高性能、高并发的特性,成为缓存和数据存储的首选方案。无论是电商抢购、社交平台的点赞计数,还是在线旅游平台的实时数据查询&…...
Linux基本指令篇 —— man指令
man命令是Linux系统中最重要的命令之一,它是"manual"(手册)的缩写,用于查看Linux系统中命令、函数、配置文件等的详细说明文档。man命令是Linux系统管理员和开发者的必备工具,熟练掌握man命令可以大大提高工…...
Spring Boot使用MCP服务器
1、JDK版本17 2、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apac…...
学习Linux进程冻结技术
原文:蜗窝科技Linux进程冻结技术 功耗中经常需要用到,但是linux这块了解甚少,看到这个文章还蛮适合我阅读的 1 什么是进程冻结 进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将…...
Docker基本概念——AI教你学Docker
1.1 Docker 概念详解 1. Docker 是什么? Docker 是一个开源的应用容器引擎,它让开发者可以将应用及其依赖打包到一个可移植的容器(Container)中,并在任何支持 Docker 的 Linux、Windows 或 macOS 系统上运行。这样做…...
第十六届蓝桥杯C/C++程序设计研究生组国赛 国二
应该是最后一次参加蓝桥杯比赛了,很遗憾,还是没有拿到国一。 大二第一次参加蓝桥杯,印象最深刻的是居然不知道1s是1000ms,花了很多时间在这题,后面节奏都乱了,抗压能力也不行,身体也不适。最后…...
Python 数据分析与可视化 Day 5 - 数据可视化入门(Matplotlib Seaborn)
🎯 今日目标 掌握 Matplotlib 的基本绘图方法(折线图、柱状图、饼图)掌握 Seaborn 的高级绘图方法(分类图、分布图、箱线图)熟悉图像美化(标题、标签、颜色、风格)完成一组学生成绩数据的可视化…...
WebRTC(八):SDP
SDP 概念 SDP 是一种描述多媒体通信会话的文本格式(基于 MIME,RFC 4566)。本身 不传输数据,仅用于在会话建立阶段传递信息。常与 SIP(VoIP)、RTSP、WebRTC 等协议配合使用。 用途 描述媒体类型…...
《哈希表》K倍区间(解题报告)
文章目录 零、题目描述一、算法概述二、算法思路三、代码实现四、算法解释五、复杂度分析 零、题目描述 题目链接:K倍区间 一、算法概述 计算子数组和能被k整除的子数组数量的算法。通过前缀和与哈希表的结合,高效地统计满足条件的子数组。 需要注…...
牛津大学开源视频中的开放世界目标计数!
视频中的开放世界目标计数 GitHub PaPer Niki Amini-Naieni nikianrobots.ox.ac.uk Andrew Zisserman azrobots.ox.ac.uk 视觉几何组(VGG),牛津大学,英国 图 1:视频中的目标计数:给定顶行的视频&#…...
1.2、CAN总线帧格式
1、帧类型 2、帧类型介绍 (1)数据帧 扩展格式是为了扩展ID,ID号每4位一个字节(11位最大ID号为0x7FF) (2)遥控帧 遥控帧由于没有Data,所以DLC可能没有意义,可给任意值&am…...
DeepSeek今天喝什么随机奶茶推荐器
用DeepSeek生成了一个随机奶茶推荐器-今天喝什么,效果非常棒!UI界面美观。 提示词prompt如下 用html5帮我生成一个今天喝什么的网页 点击按钮随机生成奶茶品牌等,要包括中国常见的知名的奶茶品牌 如果不满意还可以随机再次生成 ui界面要好看 …...
词编码模型怎么进行训练的,输出输入是什么,标签是什么
词编码模型怎么进行训练的,输出输入是什么,标签是什么 词编码模型的训练本质是通过数据驱动的方式,将离散的文本符号映射为连续的语义向量。 一、训练机制:从符号到向量的映射逻辑 1. 核心目标 将单词/子词(Token)映射为低维向量,使语义相关的词在向量空间中距离更近…...
LSTM、GRU 与 Transformer网络模型参数计算
参数计算公式对比 模型类型参数计算公式关键组成部分LSTM4 (embed_dim hidden_size hidden_size hidden_size)4个门控结构GRU3 (embed_dim hidden_size hidden_size hidden_size)3个门控结构Transformer (Encoder)12 embed_dim 9 embed_dim ff_dim 14 embed_dim…...
nnv开源神经网络验证软件工具
一、软件介绍 文末提供程序和源码下载 用于神经网络验证的 Matlab 工具箱,该工具箱实现了可访问性方法,用于分析自主信息物理系统 (CPS) 领域中带有神经网络控制器的神经网络和控制系统。 二、相关工具和软件 该工具箱利用神经…...
SQLite3 在嵌入式系统中的应用指南
SQLite3 在嵌入式系统中的应用指南 一、嵌入式系统中 SQLite3 的优势 SQLite3 是嵌入式系统的理想数据库解决方案,具有以下核心优势: 特性嵌入式系统价值典型指标轻量级适合资源受限环境库大小:500-700KB零配置无需数据库管理员开箱即用无…...
原生微信小程序网络请求与上传接口封装实战指南
本文基于微信小程序原生 API,封装 request 和 uploadFile 接口,最终实现统一请求管理、请求拦截、错误处理等能力。 📦 一、为什么要封装网络请求? 微信小程序提供了 wx.request 和 wx.uploadFile 原生 API,但直接使用…...
电路图识图基础知识-塔式起重机控制电路识图与操作要点(三十五)
引言: 塔式起重机作为建筑施工中不可或缺的大型起重运输机械设备,其控制电路的识图与操作对于确保施工安全和效率至关重要。本文将详细介绍塔式起重机的控制电路识图,帮助操作人员更好地理解和掌握其工作原理。 一、塔式起重机概述 塔式起重…...