储能变流器学习之MPPT

MPPT最大功率点追踪技术详解

引言

在可再生能源系统中,最大化能量捕获效率是核心目标。无论是光伏发电系统还是储能变流器(PCS),最大功率点追踪(MPPT) 技术都是实现这一目标的关键。本文将深入探讨MPPT技术的原理、实现算法及其在工程应用中的实践要点。

什么是MPPT?

基本概念

MPPT(Maximum Power Point Tracking)是一种通过调节电力电子变换器的工作点,使能源(如光伏电池)始终工作在最大功率输出状态的技术。对于光伏系统而言,光伏电池的I-V和P-V曲线呈非线性特性,且随光照强度、温度等环境因素变化,最大功率点(MPP)也会相应移动。

PV 电池板的功率输出取决于若干参数,例如电池板受到的辐照、电池板电压、电池板温度等。因此,在影响参数
值发生变化的条件下,功率输出也在一天之中不断变化。
下显示了太阳能电池板的 I-V 曲线和 P-V 曲线。I-V 曲线表示电池板输出电流与输出电压之间的关系。如图中的 I-V 曲线所示,当端子短接时,电池板电流最大;当端子开路且空载时,电池板电流最小。
在这里插入图片描述
如图所示,当电池板电压和电池板电流的乘积达到最大值时,从电池板获得的最大功率表示为 PMAX。该点指定为最大功率点 (MPP)。

下图举例说明各项参数对太阳能电池板输出功率的影响。这些图形还显示了太阳能电池板的功率输出随辐照度的变化。在这些图中可观察到,太阳能电池板的功率输出随辐照度的增加而增加,随辐照度的减少而减少的情况。还要注意的是,发生 MPP 时的电池板电压也随着辐照度的变化而变化。
在这里插入图片描述

为什么需要MPPT?

没有MPPT功能的光伏系统可能工作在非最佳工作点,导致能量损失可达20%-30%。MPPT技术通过实时追踪不断变化的最大功率点,可显著提高系统效率,增加能量产出。

MPPT基本原理

光伏电池的输出特性可用以下方程描述:

I=Iph−I0[exp⁡(V+IRsnVt)−1]−V+IRsRsh I = I_{ph} - I_0 \left[ \exp\left(\frac{V + IR_s}{nV_t}\right) - 1 \right] - \frac{V + IR_s}{R_{sh}} I=IphI0[exp(nVtV+IRs)1]RshV+IRs

其中,IphI_{ph}Iph为光生电流,I0I_0I0为反向饱和电流,RsR_sRs为串联电阻,RshR_{sh}Rsh为并联电阻,nnn为理想因子,VtV_tVt为热电压。

最大功率点处的数学特性为:

dPdV=0 \frac{dP}{dV} = 0 dVdP=0

MPPT算法的核心就是通过不断调整工作点,使系统满足这一条件。

常用MPPT算法及实现

1. 扰动观察法(P&O)

原理

P&O算法通过周期性扰动工作点(电压或占空比),并观察功率变化方向来决定下一步的扰动方向。

算法流程
  1. 扰动工作点(增加或减少电压/占空比)
  2. 测量功率变化
  3. 如果功率增加,保持相同扰动方向;如果功率减少,反转扰动方向
  4. 重复上述过程
C语言实现代码-基本扰动观察法
// 扰动观察法实现
#define DELTA_D 0.01f  // 扰动步长float prev_voltage = 0.0f;
float prev_current = 0.0f;
float prev_power = 0.0f;
float duty_cycle = 0.5f;void mppt_po_algorithm(void) {// 读取当前电压和电流float voltage = read_voltage();float current = read_current();float power = voltage * current;// 计算功率变化float delta_p = power - prev_power;float delta_v = voltage - prev_voltage;// 应用P&O逻辑if (delta_p > 0) {duty_cycle += (delta_v > 0) ? DELTA_D : -DELTA_D;} else {duty_cycle += (delta_v > 0) ? -DELTA_D : DELTA_D;}// 限制占空比范围duty_cycle = (duty_cycle > 0.95f) ? 0.95f : duty_cycle;duty_cycle = (duty_cycle < 0.05f) ? 0.05f : duty_cycle;// 更新PWM并保存状态set_duty_cycle(duty_cycle);prev_voltage = voltage;prev_current = current;prev_power = power;
}
可复用-扰动观察法
/*** @brief MPPT(最大功率点跟踪)算法结构体* * 该结构体包含了MPPT算法所需的所有参数和状态变量* 实现了扰动观察法(Perturb and Observe)MPPT算法*/
typedef struct {float32_t  Ipv;        // 当前光伏电流值float32_t  Vpv;        // 当前光伏电压值float32_t  MaxI;       // 最大允许电流限制float32_t  MinI;       // 最小允许电流限制float32_t  Stepsize;   // MPPT步长,用于调整电流参考值float32_t  ImppOut;    // MPPT输出的电流参考值// 内部状态变量float32_t  Step;       // 当前步长(未使用)float32_t  PpvOld;     // 上一次的功率值float32_t  IpvOld;     // 上一次的电流值int16_t mppt_first;    // 首次运行标志位int mppt_enable;       // MPPT使能标志位
} uinv_dcdc_mppt_t;/*** @brief MPPT算法初始化函数* @param v MPPT结构体指针* * 初始化MPPT算法的状态变量,设置首次运行标志*/
static void uinv_dcdc_mppt_init(uinv_dcdc_mppt_t *v) {v->mppt_first = 1;  // 设置首次运行标志
}/*** @brief MPPT算法主运行函数* @param v MPPT结构体指针* * 实现扰动观察法MPPT算法:* 1. 计算当前功率点* 2. 比较当前功率与上一次功率* 3. 根据功率变化趋势调整电流参考值* 4. 确保输出电流在安全范围内*/
#pragma FUNC_ALWAYS_INLINE(uinv_dcdc_mppt_run)
static void uinv_dcdc_mppt_run(uinv_dcdc_mppt_t *v) {// 计算当前功率点 P = V × Ifloat32_t P = v->Vpv * v->Ipv;// 检查MPPT是否使能if(v->mppt_enable) {// 首次运行时的初始化if(v->mppt_first) {v->ImppOut = v->Ipv;    // 设置初始电流参考值为当前电流v->PpvOld = P;          // 保存当前功率值v->IpvOld = v->Ipv;     // 保存当前电流值v->mppt_first = 0;      // 清除首次运行标志} else {// 计算电流变化量float32_t deltaI = v->Ipv - v->IpvOld;// 扰动观察法核心逻辑if(deltaI > 0) { // 如果电流在增加if(P > v->PpvOld) { // 且功率也在增加// 继续增加电流(向最大功率点方向移动)v->ImppOut = v->Ipv + v->Stepsize;} else { // 但功率在减少// 减少电流(反向移动,避免越过最大功率点)v->ImppOut = v->Ipv - v->Stepsize;}} else { // 如果电流在减少if(P > v->PpvOld) { // 且功率在增加// 继续减少电流(向最大功率点方向移动)v->ImppOut = v->Ipv - v->Stepsize;} else { // 且功率也在减少// 增加电流(反向移动,避免越过最大功率点)v->ImppOut = v->Ipv + v->Stepsize;}}}}// 电流限幅保护:确保输出电流在安全范围内v->ImppOut = (v->ImppOut < v->MinI) ? v->MinI : v->ImppOut;  // 下限保护v->ImppOut = (v->ImppOut > v->MaxI) ? v->MaxI : v->ImppOut;  // 上限保护// 更新历史值,为下次计算做准备v->IpvOld = v->Ipv;  // 保存当前电流值v->PpvOld = P;       // 保存当前功率值
}#endif /* UINV_DCDC_MPPT_H_ */

代码分析

这段代码实现了一个**扰动观察法(Perturb and Observe, P&O)**的MPPT(最大功率点跟踪)算法,用于太阳能光伏系统中。以下是详细解释:

1. 算法原理

MPPT算法的目的是让光伏系统始终工作在最大功率点,从而获得最大的能量输出。扰动观察法的基本原理是:

  • 通过小幅扰动(改变工作电流)来观察功率变化
  • 根据功率变化趋势决定下一步的扰动方向
  • 逐步收敛到最大功率点

2. 核心逻辑分析

初始化阶段:

  • 首次运行时,记录当前电流和功率值作为基准

扰动观察阶段:

  • 计算当前功率:P = Vpv × Ipv
  • 比较当前功率与上一次功率的变化
  • 根据电流变化方向和功率变化趋势决定下一步动作:
电流变化功率变化下一步动作说明
增加增加继续增加电流向最大功率点方向移动
增加减少减少电流反向移动,避免越过最大功率点
减少增加继续减少电流向最大功率点方向移动
减少减少增加电流反向移动,避免越过最大功率点

3. 安全保护

  • 电流限幅:确保输出电流在MinIMaxI范围内
  • 使能控制:通过mppt_enable标志控制算法是否运行

4. 算法特点

  • 简单高效:实现简单,计算量小
  • 自适应性:能够自动跟踪最大功率点
  • 稳定性:在最大功率点附近会有小幅振荡,这是该算法的固有特性
C语言实现代码-基于变步长扰动观察法
/************************************************************************/
/*** @brief 最大功率点跟踪算法主函数* @details 实现扰动观察法(P&O)MPPT算法,通过调整光伏电压参考值来寻找最大功率点*          算法包含快速搜索、动态调整、功率限制等功能*/
void MPPTTrack(void)
{float32 f32Temp0;	// 临时变量,用于存储最大功率值// 静态变量,用于算法控制static int16 Counter = 0;           // 连续功率增加计数器static int16 test_dynamic_Flag = 0; // 动态测试标志位static int16 CounterPVPos = 0;      // PV电压过高计数器static int16 CounterPVNeg = 0;      // PV电压过低计数器static float32 Delta_MPPTStep = 4;  // MPPT步长,初始值为4V// 计算功率变化阈值,基于当前功率的0.1%g_MpptCalc.f32DeltaPowerDC = g_MpptCalc.f32PVWattCurrent * 0.001f;// 限制功率变化阈值在3-5W之间,确保算法稳定性if(g_MpptCalc.f32DeltaPowerDC < 3){g_MpptCalc.f32DeltaPowerDC = 3;}else if(g_MpptCalc.f32DeltaPowerDC > 5){g_MpptCalc.f32DeltaPowerDC = 5;}else{}// 根据当前功率调整MPPT步长,实现自适应步长控制if(g_MpptCalc.f32PVWattCurrent < 2000)  // 功率小于2kW时使用较大步长{Delta_MPPTStep = DeltaMPPTV;}else if(g_MpptCalc.f32PVWattCurrent > 4000)  // 功率大于4kW时使用较小步长{Delta_MPPTStep = 2;}else{}// 获取两个MPPT通道中的最大功率值f32Temp0 = MAX(g_Mppt1Calc.f32PVWattCurrent, g_Mppt2Calc.f32PVWattCurrent);// 功率限制保护:当功率超过限制时,增加电压参考值以降低功率if((g_MpptCalc.f32PVWattCurrent > g_PActiveLimit.f32PinputAll)||(f32Temp0 > g_PActiveLimit.f32Pinput1)){// 保存历史电压参考值g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PVWattOld = g_MpptCalc.f32PVWattCurrent;// 增加电压参考值以降低功率g_MpptCalc.f32PvVoltRef +=	1;return;  // 功率限制时直接返回,不执行MPPT算法}// PV电压范围保护:确保PV电压在合理范围内if(g_MpptCalc.f32PvVoltRef > g_CalcResult.Ave.f32VPV1 + PV15V)  // 电压过高{CounterPVPos++;if(CounterPVPos>2)  // 连续3次电压过高,强制调整{g_MpptCalc.f32PvVoltRef  = g_CalcResult.Ave.f32VPV1  - Delta_MPPTStep;CounterPVPos = 0;}}else if(g_MpptCalc.f32PvVoltRef < g_CalcResult.Ave.f32VPV1 - PV15V)  // 电压过低{CounterPVNeg++;if(CounterPVNeg>2)  // 连续3次电压过低,强制调整{g_MpptCalc.f32PvVoltRef  = g_CalcResult.Ave.f32VPV1  - Delta_MPPTStep;CounterPVNeg = 0;}}else  // 电压在正常范围内,执行MPPT算法{// 重置电压异常计数器CounterPVNeg = 0;CounterPVPos = 0;// 快速搜索模式:用于系统启动时的快速定位if(1 == g_MpptCalc.u16FastSearch){// 如果电压高于开路电压的83%,逐步降低电压if(g_MpptCalc.f32PvVoltRef  > (g_MpptCalc.f32PvOpenVolt * 0.83)){g_MpptCalc.f32PvVoltRef  = g_MpptCalc.f32PvVoltRef - g_MpptCalc.f32PvOpenVolt * 0.01;				}else  // 达到合适电压范围,退出快速搜索模式{g_MpptCalc.f32PvVoltRef  = g_MpptCalc.f32PvVoltRef  + Delta_MPPTStep;     g_MpptCalc.u16FastSearch = 0;test_dynamic_Flag = 0;Counter = 0;}// 保存历史值g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PVWattOld = g_MpptCalc.f32PVWattCurrent;}else  // 正常MPPT跟踪模式{// 功率增加情况:当前功率大于等于上次功率+阈值if(g_MpptCalc.f32PVWattOld + g_MpptCalc.f32DeltaPowerDC <= g_MpptCalc.f32PVWattCurrent)             {Counter++;  // 增加连续功率增加计数if(Counter > 3)  // 连续4次功率增加,启用动态测试模式{test_dynamic_Flag=1;Counter = 0;}// 动态测试模式:使用更精细的步长调整if(test_dynamic_Flag==1){if (g_MpptCalc.f32PvVoltRef >= g_MpptCalc.f32PvRefOld)  // 上次电压增加{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PvVoltRef = g_MpptCalc.f32PvRefOld - 0.1;  // 小幅降低电压}else if(g_MpptCalc.f32PvVoltRef < g_MpptCalc.f32PvRefOld)  // 上次电压降低{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PvVoltRef = g_MpptCalc.f32PvRefOld + 0.3;  // 小幅增加电压}else{}}else  // 正常模式:使用标准步长{	if(g_MpptCalc.f32PvVoltRef  >= g_MpptCalc.f32PvRefOld)  // 上次电压增加{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PvVoltRef += Delta_MPPTStep;  // 继续增加电压}else  // 上次电压降低{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PvVoltRef  -= Delta_MPPTStep;  // 继续降低电压}}g_MpptCalc.f32PVWattOld = g_MpptCalc.f32PVWattCurrent;  // 更新历史功率值}// 功率减少情况:当前功率明显小于上次功率else if(g_MpptCalc.f32PVWattOld > g_MpptCalc.f32PVWattCurrent + g_MpptCalc.f32DeltaPowerDC){test_dynamic_Flag = 0;  // 退出动态测试模式Counter = 0;  // 重置计数器// 反向调整电压:与上次调整方向相反if(g_MpptCalc.f32PvVoltRef  >= g_MpptCalc.f32PvRefOld)  // 上次电压增加{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PvVoltRef  -= Delta_MPPTStep;  // 降低电压}else  // 上次电压降低{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef;g_MpptCalc.f32PvVoltRef  += Delta_MPPTStep;  // 增加电压}g_MpptCalc.f32PVWattOld = g_MpptCalc.f32PVWattCurrent;}// 功率变化不明显:使用较小步长微调else{test_dynamic_Flag = 0;  // 退出动态测试模式Counter = 0;  // 重置计数器// 使用较小步长(40%的标准步长)进行微调if(g_MpptCalc.f32PvVoltRef  >= g_MpptCalc.f32PvRefOld)  // 上次电压增加{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef ;g_MpptCalc.f32PvVoltRef  += (Delta_MPPTStep * 0.4);  // 小幅增加电压}else  // 上次电压降低{g_MpptCalc.f32PvRefOldOld = g_MpptCalc.f32PvRefOld;g_MpptCalc.f32PvRefOld = g_MpptCalc.f32PvVoltRef ;g_MpptCalc.f32PvVoltRef  -= (Delta_MPPTStep * 0.4);  // 小幅降低电压}               }}}// 电压下限保护:确保PV电压不低于最小工作电压if(g_MpptCalc.f32PvVoltRef  < PV250V + 5)  {g_MpptCalc.f32PvVoltRef  = PV250V + 5;  // 强制设置为最小工作电压}
}
优缺点
  • 优点:实现简单,计算量小
  • 缺点:在MPP附近振荡,光照突变时可能误判

2. 电导增量法(Incremental Conductance)

原理

基于最大功率点处的数学特性:dIdV=−IV\frac{dI}{dV} = -\frac{I}{V}dVdI=VI

算法流程
  1. 测量当前电压和电流
  2. 计算电导(I/V)和微分电导(dI/dV)
  3. 比较两者关系决定调整方向
  4. 重复上述过程
C语言实现代码
// 电导增量法实现
#define DELTA_D 0.005f
#define MIN_DV 0.01f  // 最小电压变化阈值float prev_voltage = 0.0f;
float prev_current = 0.0f;
float duty_cycle = 0.5f;void mppt_incond_algorithm(void) {float voltage = read_voltage();float current = read_current();float delta_v = voltage - prev_voltage;if (fabs(delta_v) < MIN_DV) {// 处理小电压变化情况float cond = current / voltage;if (fabs(cond) > 0.01f) {duty_cycle += (cond > 0) ? -DELTA_D : DELTA_D;}} else {float delta_i = current - prev_current;float inc_cond = delta_i / delta_v;float inst_cond = current / voltage;if (fabs(inc_cond + inst_cond) < 0.01f) {// 已在MPP附近} else if (inc_cond > -inst_cond) {duty_cycle -= DELTA_D;} else {duty_cycle += DELTA_D;}}// 限制和更新duty_cycle = (duty_cycle > 0.95f) ? 0.95f : duty_cycle;duty_cycle = (duty_cycle < 0.05f) ? 0.05f : duty_cycle;set_duty_cycle(duty_cycle);prev_voltage = voltage;prev_current = current;
}
优缺点
  • 优点:对光照突变响应好,稳态精度高
  • 缺点:计算复杂,对传感器精度要求高

3. 其他算法

恒定电压法(CV)

基于MPP电压与开路电压近似成比例关系的假设(Vmpp≈k⋅VocV_{mpp} ≈ k \cdot V_{oc}VmppkVoc)。实现简单但精度较低,常作为辅助启动方法。

智能算法
  • 模糊逻辑控制:无需精确数学模型,鲁棒性强
  • 神经网络控制:需要训练但精度高
  • 粒子群优化(PSO):适用于局部遮阴等多峰情况

工程应用实践

单通道 vs 多通道MPPT

单通道输入
  • 所有组串并联接入单个MPPT通道
  • 成本低但存在"木桶效应"
  • 适合组件条件一致的场景
多通道输入
  • 多个独立MPPT通道,各自追踪最佳工作点
  • 抗失配能力强,发电效率高
  • 适合复杂安装环境(多朝向、部分遮挡)

实际应用考虑因素

  1. 采样频率选择:通常10-100Hz,需在响应速度和噪声抑制间平衡
  2. 步长设计:大的步长响应快但振荡大,小的步长精度高但响应慢
  3. 硬件保护:过压、过流保护必须优先于MPPT算法
  4. 启动策略:常采用CV法提供初始工作点
  5. 软件滤波:对采样值进行滤波处理,提高稳定性

在储能变流器中的应用特点

储能变流器中的MPPT技术与光伏逆变器类似,但有以下特点:

  1. 双向能量流动:需要考虑充放电不同模式下的MPPT策略
  2. 电池SOC影响:电池状态可能限制MPPT的工作范围
  3. 多源协调:需要与电网、负载等其他能源协调工作

未来发展趋势

  1. AI与机器学习应用:提高MPPT在复杂环境下的性能
  2. 多目标优化:兼顾效率、电池寿命、电网要求等多重目标
  3. 预测性MPPT:结合天气预报提前优化工作策略
  4. 分布式MPPT:组件级MPPT进一步提高系统效率

结论

MPPT技术是提高可再生能源系统效率的关键技术。在实际工程中,需要根据具体应用场景选择合适的算法和硬件架构。对于大多数应用,改进型的P&O和IncCond算法因其在性能和复杂度间的良好平衡而成为首选。随着技术发展,智能算法和多目标优化将成为未来发展方向。

理解MPPT不仅需要掌握算法原理,更需要结合实际工程 constraints 进行系统级优化,才能在效率、成本和可靠性间找到最佳平衡点。

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

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

相关文章

qData 数据中台完整功能介绍 —— 商业版与开源版功能对比

一、qData 数据中台概览 在数字化转型的大背景下&#xff0c;数据已经成为企业最核心、最具价值的资产。qData 数据中台&#xff0c;作为企业数据治理与应用的关键平台&#xff0c;凭借高性能与创新理念脱颖而出。它秉持 “高效、安全、灵活、开放” 的设计原则&#xff0c;致力…

Xshell 自动化脚本大赛技术文章大纲

一、引言1.1 大赛背景与意义介绍 Xshell 在运维、开发等领域的广泛应用&#xff0c;强调自动化脚本对于提升效率、减少错误的重要性。阐述大赛旨在激发用户创新&#xff0c;挖掘 Xshell 自动化脚本更多潜力&#xff0c;促进技术交流与共享。1.2 目标受众明确文章面向熟悉基本 L…

Python 数据分析学习笔记:Pandas 逻辑运算

&#x1f539; DA9&#xff1a;2020年毕业且使用Java的用户&#x1f4cc; 题目描述筛选出 2020年毕业 且 常用语言为 Java 的用户&#xff0c;输出他们的全部信息&#xff0c;并设置显示选项以完整显示数据。✅ 正确代码import pandas as pd# 读取数据 Nowcoder pd.read_csv(N…

图像边缘检测

目录 一.图像边缘检测 1.图像边缘检测概述 2.Sobel算子原理与实现 3.Scharr算子 4.Laplacian算子 5.Canny边缘检测&#xff08;重点&#xff09; 6.效果对比 一.图像边缘检测 1.图像边缘检测概述 2.Sobel算子原理与实现 代码是实现步骤&#xff1a; 边缘检测是图像处…

zookeeper-znode解析

一. 数据模型&#xff1a;ZK拥有一个命名空间就像一个精简的文件系统&#xff0c;不同的是它的命名空间中的每个节点拥有它自己或者它下面子节点相关联的数据。ZK中必须使用绝对路径也就是使用“/”开头。二. znode&#xff1a;zk目录树中每个节点对应一个znode。每个znode维护…

Redis 高可用篇

主从复制是怎么实现的&#xff1f; 如果服务器发生了宕机&#xff0c;由于数据恢复是需要点时间&#xff0c;那么这个期间是无法服务新的请求的&#xff1b;如果这台服务器的硬盘出现了故障&#xff0c;可能数据就都丢失了。 要避免这种单点故障&#xff0c;最好的办法是将数据…

C++ 指针与引用面试深度解析

C 指针与引用面试深度解析面试官考察指针和引用&#xff0c;不仅是考察语法&#xff0c;更是在考察你对C中 “别名” (Aliasing) 与 “地址” (Addressing) 这两种间接访问机制的理解&#xff0c;以及你对 “代码安全” 和 “接口设计” 的思考深度。第一部分&#xff1a;核心知…

LinuxC语言线程的同步与互斥

一.线程的同步与互斥1. 基础概念:1.1 互斥&#xff1a;对共享资源的访问&#xff0c;同一时刻只允许一个访问者进行访问&#xff0c;互斥具有唯一和排他性&#xff0c;互斥无法保证对共享资源的访问顺序1.2 同步: 在互斥的基础上&#xff0c;实现对共享资源的有序访问。2. 互斥…

Centos 7.6离线安装docker

在内网环境下&#xff0c;一般不能联网在线部署&#xff0c;这时候就需要以离线的方式安装docker。本节内容主要总结一下在CentOS 7.6环境中离线安装docker的步骤。 1、下载docker安装包 https://pan.baidu.com/share/init?surlPaUllQZ-dwpgJ7quA5IkcQ&pwd4sfc 2、上传到服…

生成式推荐模型的长序列特征:离线存储

文章目录长序列特征的例子1. Event-level features2. Sequence-level featuresAggregation FeaturesSession-based FeaturesTemporal Order Features3. User-level features4. Interaction features (between user and item/context)how to store the long term user behaviro …

Linux inode 实现机制深入分析

Linux inode 实现机制深入分析 1 Inode 基本概念与作用 Inode&#xff08;Index Node&#xff09;是 Linux 和其他类 Unix 操作系统中文件系统的核心数据结构&#xff0c;用于存储文件或目录的元数据&#xff08;metadata&#xff09;。每个文件或目录都有一个唯一的 inode&…

Flask 之请求钩子详解:掌控请求生命周期

在构建现代 Web 应用时&#xff0c;我们常常需要在请求的不同阶段自动执行一些通用逻辑&#xff0c;例如&#xff1a;记录日志、验证权限、连接数据库、压缩响应、添加安全头等。如果在每个视图函数中重复这些代码&#xff0c;不仅冗余&#xff0c;而且难以维护。Flask 请求钩子…

设计模式七大原则附C++正反例源码

设计模式的七大原则是软件设计的基石,它们指导开发者构建高内聚、低耦合、易维护、可扩展的系统。以下以C++为例,详细介绍这七大原则: 一、单一职责原则(Single Responsibility Principle, SRP) 定义:一个类应该只有一个引起它变化的原因(即一个类只负责一项职责)。 …

云计算之中间件与数据库

一、云数据库的特性云数据库是指被优化或部署到一个虚拟计算环境中的数据库&#xff0c;可以实现按需付费、按需扩展、高可用性以及存储整合等优势。根据数据库类型一般分为关系型数据库和非关系型数据库&#xff08;NoSQL数据库&#xff09; 。云数据库的特性序号云数据库的特…

codeforces(1045)(div2) E. Power Boxes

E.电源箱 每次测试时限&#xff1a; 2 秒 每次测试的内存限制&#xff1a;256 兆字节 输入&#xff1a;标准输入 输出&#xff1a;标准输出 这是一个互动问题。 给你 nnn 个方格&#xff0c;索引从 111 到 nnn 。这些方格看起来完全相同&#xff0c;但是每个方格都有一个隐藏的…

4G模块 EC200通过MQTT协议连接到阿里云

命令说明 基础AT指令ATI显示MT的ID信息ATCIMI查询IMSIATQCCID查询ICCIDATCSQ查询信号强度ATCGATT?查询当前PS域状态MQTT配置指令ATQMTCFG配置MQTT可选参数ATQMTCFG配置MQTT可选参数.ATQMTOPEN打开MQTT客户端网络ATQMTCLOSE关闭MQTT客户端网络ATQMTCONN连接客户端到MQTT服务器…

如何选择合适的安全监测预警系统

在当今高度复杂和互联的数字化时代&#xff0c;安全威胁无处不在且持续演变。一套高效、可靠的安全监测预警系统已成为组织保障其物理资产、数字信息和关键业务连续性的核心基础设施。然而&#xff0c;面对市场上琳琅满目的产品和解决方案&#xff0c;如何做出符合自身需求的选…

ELK-使用logstash-output-zabbix插件实现日志通过zabbix告警

ELK-使用logstash-output-zabbix插件实现日志通过zabbix告警logstash-output-zabbix插件安装编辑logstash配置文件在zabbix上创建模板实现的效果:elk收集上来的日志中含有报错时(例如error等)&#xff0c;logstash过滤出来将这部分日志打到zabbix&#xff0c;再通过zabbix结合钉…

【C++游记】物种多样——谓之多态

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…