Redis 调优:必须关注的几个参数

news/2026/1/19 9:56:37/文章来源:https://www.cnblogs.com/ivictor/p/19500281

背景

在一台未经过任何调优的 Linux 服务器上部署 Redis,在 Redis 启动过程中,可能会碰到以下警告信息。

1363410:M 15 Jan 2026 13:07:34.879 # WARNING: The TCP backlog setting of 512 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1363410:M 15 Jan 2026 13:07:34.879 # Server initialized
1363410:M 15 Jan 2026 13:07:34.879 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1363410:M 15 Jan 2026 13:07:34.879 # WARNING You have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').

这些警告信息实际上是在提醒我们,操作系统的某些参数设置得不合理,需要调整,否则会影响 Redis 的性能和稳定性。

除此之外,Redis 还提供了多个参数,用于在进程或连接级别进行内核参数优化,例如:

  • tcp-backlog:设置 TCP 服务器中listen()的 backlog 参数。

  • disable-thp:在进程级别关闭透明大页(THP)。

  • tcp-keepalive:在连接级别设置 TCP Keepalive 参数。

  • server_cpulist、bio_cpulist:可将 Redis 进程或后台 I/O 线程绑定到指定 CPU。

  • oom-score-adjoom-score-adj-values:调整进程的 oom_score。oom_score 是 Linux 内核为每个进程计算的一个整数值(位于/proc/[pid]/oom_score),分数越高,进程在内存不足时越容易被 OOM Killer 杀死。

下面,我们看看这些参数的实现细节和设置建议。

tcp-backlog

createIntConfig("tcp-backlog", NULL, IMMUTABLE_CONFIG, 0, INT_MAX, server.tcp_backlog, 511, INTEGER_CONFIG, NULL, NULL), /* TCP listen backlog. */

tcp-backlog 用于设置 TCP 服务器在调用listen()时使用的 backlog 参数。该参数用于指定已完成三次握手、但尚未被accept()处理的连接队列长度。

下面是一个典型的 TCP 服务器流程:

// 1. 创建 socket
int fd = socket(AF_INET, SOCK_STREAM, 0); 
// 2. 绑定 IP + 端口
bind(fd, ...);   
// 3. 开始监听
listen(fd, backlog);       
// 4. 接受连接
int connfd = accept(fd, ...);              

当客户端发起连接时:

  1. TCP 三次握手完成后,连接会被放入已完成连接队列(accept queue),其长度由listen(backlog)控制。
  2. 服务器通过accept()从队列中取走连接,交给应用层处理。
  3. 当已完成连接队列已满时,新完成三次握手的连接无法进入 accept queue,内核通常会丢弃或延迟 ACK,导致客户端出现连接超时、重传。

tcp-backlog 的默认值为 511,对应的内存变量为 server.tcp_backlog。

static int anetListen(char *err, int s, struct sockaddr *sa, socklen_t len, int backlog) {
    // 将 socket 绑定到指定的 IP 和端口
    if (bind(s,sa,len) == -1) {
        anetSetError(err, "bind: %s", strerror(errno));
        close(s);
        return ANET_ERR;
    }
    // 将 socket 设置为监听状态,开始接收客户端连接,backlog 指定内核允许排队的最大未处理连接数
    if (listen(s, backlog) == -1) {
        anetSetError(err, "listen: %s", strerror(errno));
        close(s);
        return ANET_ERR;
    }
    return ANET_OK;
}

实例在启动时,会调用checkTcpBacklogSettings()检查 server.tcp_backlog 的配置是否合理。

void checkTcpBacklogSettings(void) {
#if defined(HAVE_PROC_SOMAXCONN)
    FILE *fp = fopen("/proc/sys/net/core/somaxconn","r");
    char buf[1024];
    if (!fp) return;
    if (fgets(buf,sizeof(buf),fp) != NULL) {
        int somaxconn = atoi(buf);
        if (somaxconn > 0 && somaxconn < server.tcp_backlog) {
            serverLog(LL_WARNING,"WARNING: The TCP backlog setting of %d cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of %d.", server.tcp_backlog, somaxconn);
        }
    }
    fclose(fp);
...
#endif
}

具体实现上,它会获取/proc/sys/net/core/somaxconn的值。

somaxconn 决定了 Linux 内核允许的单个 TCP socket 的最大 backlog 队列长度,也就是listen()的 backlog 参数在内核层面的上限。

如果 somaxconn 的值小于 tcp-backlog,Redis 会打印如下信息,此时,在listen()函数中实际生效的就是 somaxconn 的值。

# WARNING: The TCP backlog setting of 512 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

设置建议:对于普通的 Web 服务(几百并发),默认值(511)已经足够。如果是高并发服务(上万并发 TCP 连接),可将 backlog 调整为 4096 甚至更高。

disable-thp

createBoolConfig("disable-thp", NULL, IMMUTABLE_CONFIG, server.disable_thp, 1, NULL, NULL),

disable-thp 用来控制是否在进程级别关闭透明大页。默认值是 1,对应的内部变量是 server.disable_thp。

实例在启动时,会调用linuxMemoryWarnings判断 Linux 系统内存相关的配置。

void linuxMemoryWarnings(void) {
    sds err_msg = NULL;
    if (checkOvercommit(&err_msg) < 0) {
        serverLog(LL_WARNING,"WARNING %s", err_msg);
        sdsfree(err_msg);
    }
    if (checkTHPEnabled(&err_msg) < 0) {
        server.thp_enabled = 1;
        if (THPDisable() == 0) {
            server.thp_enabled = 0;
        } else {
            serverLog(LL_WARNING, "WARNING %s", err_msg);
        }
        sdsfree(err_msg);
    }
}

在具体实现上,该函数首先会调用checkOvercommit获取/proc/sys/vm/overcommit_memory的值,如果 overcommit_memory 值不为 1,则会提示以下警告信息。

# WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

在 Redis 中,建议将 vm.overcommit_memory 设置为 1,否则fork()子进程(如 RDB、AOF rewrite、全量复制)操作在低内存时会失败。

接着,会调用checkTHPEnabled获取/sys/kernel/mm/transparent_hugepage/enabled的值,如果它的值为 always,则会调用THPDisable()

该函数会基于 server.disable_thp 的值来决定是否禁用当前进程的透明大页。

#include <sys/prctl.h>
/* since linux-3.5, kernel supports to set the state of the "THP disable" flag
 * for the calling thread. PR_SET_THP_DISABLE is defined in linux/prctl.h */
static int THPDisable(void) {
    int ret = -EINVAL;

    if (!server.disable_thp)
        return ret;

#ifdef PR_SET_THP_DISABLE
    ret = prctl(PR_SET_THP_DISABLE, 1, 0, 0, 0);
#endif

    return ret;
}

如果该变量的值为 0,则不关闭,如果为 1,则会调用prctl(PR_SET_THP_DISABLE, 1, 0, 0, 0)禁用当前进程的透明大页。

如果操作系统开启了透明大页,且 Redis 没有关闭,则会在日志中打印以下信息。

# WARNING You have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').

在 Redis 中,建议关闭透明大页,否则fork() 操作可能因管理大页而显著变慢,而且内存紧张时,合并/拆分大页操作也会增加  Redis 响应耗时。

设置建议:默认值即可。

tcp-keepalive

createIntConfig("tcp-keepalive", NULL, MODIFIABLE_CONFIG, 0, INT_MAX, server.tcpkeepalive, 300, INTEGER_CONFIG, NULL, NULL),

tcp-keepalive 的默认值为 300,对应的内部变量是 server.tcpkeepalive。

Redis 会在建立 TCP 连接后调用anetKeepAlive函数,通过 setsockopt 配置底层 socket 的 keepalive 参数:

int anetKeepAlive(char *err, int fd, int interval)
{
    int val = 1;
    // 启用 TCP keepalive
    if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) == -1)
    {
        anetSetError(err, "setsockopt SO_KEEPALIVE: %s", strerror(errno));
        return ANET_ERR;
    }
    // 设置首次探测时间:空闲 interval 秒后开始发送第一个探测包
    val = interval;
    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) < 0) {
        anetSetError(err, "setsockopt TCP_KEEPIDLE: %s\n", strerror(errno));
        return ANET_ERR;
    }
    // 设置探测间隔:每 interval/3 秒发送一次探测包
    val = interval/3;
    if (val == 0) val = 1;
    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0) {
        anetSetError(err, "setsockopt TCP_KEEPINTVL: %s\n", strerror(errno));
        return ANET_ERR;
    }
    // 设置最大探测次数:连续 3 次探测失败后判定连接已死
    val = 3;
    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0) {
        anetSetError(err, "setsockopt TCP_KEEPCNT: %s\n", strerror(errno));
        return ANET_ERR;
    }
    ...
    return ANET_OK;
}

下面是 Redis 中的设置与 Linux 对应参数默认值的对比:

选项对应内核参数作用代码逻辑与默认值对比
TCP_KEEPIDLE net.ipv4.tcp_keepalive_time 首次探测的等待时间。连接空闲多久后发送第一个探测包。 设为 tcp-keepalive。默认是 7200 秒。
TCP_KEEPINTVL net.ipv4.tcp_keepalive_intvl 探测间隔。两个探测包之间的时间。 设为 tcp-keepalive/3(最小为1)。默认是 75 秒。
TCP_KEEPCNT net.ipv4.tcp_keepalive_probes 探测次数。达到次数后仍无响应则判定连接死亡。 固定设为 3。默认是 9 次。

Redis 通过在连接级别设置较短的 TCP Keepalive 参数,可以提前发现死掉或异常的客户端连接;避免长时间保留无效连接占用资源;提高 Redis 在长连接和高并发场景下的稳定性。

设置建议:默认值即可。如果网络质量特别差,可设置更小的值。

xxx_cpulist

Redis 支持通过参数对不同执行单元进行 CPU 绑定,相关参数如下:

createStringConfig("server_cpulist", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, server.server_cpulist, NULL, NULL, NULL),
createStringConfig("bio_cpulist", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, server.bio_cpulist, NULL, NULL, NULL),
createStringConfig("aof_rewrite_cpulist", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, server.aof_rewrite_cpulist, NULL, NULL, NULL),
createStringConfig("bgsave_cpulist", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, server.bgsave_cpulist, NULL, NULL, NULL),

其中,server_cpulist、bio_cpulist、bgsave_cpulist、aof_rewrite_cpulist 分别用于绑定 Redis 主线程、BIO 后台线程、RDB 子进程和 AOF rewrite 子进程。

在实现上,Redis 提供了setcpuaffinity函数来封装 CPU 绑定操作,该函数会根据操作系统调用对应接口。例如,在 Linux 上,它会使用sched_setaffinity将线程绑定到指定核心。

void redisSetCpuAffinity(const char *cpulist) {
#ifdef USE_SETCPUAFFINITY
    setcpuaffinity(cpulist);
#else
    UNUSED(cpulist);
#endif
}

/* set current thread cpu affinity to cpu list, this function works like
 * taskset command (actually cpulist parsing logic reference to util-linux).
 * example of this function: "0,2,3", "0,2-3", "0-20:2". */
void setcpuaffinity(const char *cpulist) {
...
#ifdef __linux__
    sched_setaffinity(0, sizeof(cpuset), &cpuset);
#endif
#ifdef __FreeBSD__
    cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, sizeof(cpuset), &cpuset);
#endif
#ifdef __DragonFly__
    pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset);
#endif
#ifdef __NetBSD__
    pthread_setaffinity_np(pthread_self(), cpuset_size(cpuset), cpuset);
    cpuset_destroy(cpuset);
#endif
}

对于 Redis 这种单线程应用(主线程只能在一个 CPU 核心上处理请求)来说,进行 CPU 绑定的好处显而易见:减少 CPU 上下文切换、提高 CPU Cache 命中率、避免受到其他高负载任务的干扰。唯一的不足是增加了运维的配置和管理成本。

oom-score-adj、oom-score-adj-values

createEnumConfig("oom-score-adj", NULL, MODIFIABLE_CONFIG, oom_score_adj_enum, server.oom_score_adj, OOM_SCORE_ADJ_NO, NULL, updateOOMScoreAdj),
createSpecialConfig("oom-score-adj-values", NULL, MODIFIABLE_CONFIG | MULTI_ARG_CONFIG, setConfigOOMScoreAdjValuesOption, getConfigOOMScoreAdjValuesOption, rewriteConfigOOMScoreAdjValuesOption, updateOOMScoreAdj),

其中,

  • oom-score-adj:是否启用 OOM 调整。可选值有:
    • no:禁用。默认值。
    • yes / relative:启用相对模式(在系统原始 OOM 值的基础上叠加)。
    • absolute:启用绝对模式(直接使用配置值,不考虑系统原始值)。
  • oom-score-adj-values:针对不同角色设置 OOM 权重。该参数需要配置三个值,分别对应:主节点、从节点、后台子进程(BGCHILD,用于 RDB / AOF / 复制)。默认值为0 200 800。数值越大,表示在系统内存紧张时越容易被 OOM Killer 杀死。

无论是修改 oom-score-adj 还是 oom-score-adj-values,都会调用updateOOMScoreAdj 。

该函数会根据进程角色(主节点、从节点或后台子进程)为当前进程设置对应的 oom_score_adj 值。

static int updateOOMScoreAdj(const char **err) {
    if (setOOMScoreAdj(-1) == C_ERR) {
        *err = "Failed to set current oom_score_adj. Check server logs.";
        return0;
    }

    return1;
}

// 根据进程类别设置 Redis 的 oom_score_adj,process_class: 进程类别,-1 表示自动选择
int setOOMScoreAdj(int process_class) {
    // 如果传入 -1,自动根据角色选择 master 或 replica
    if (process_class == -1)
        process_class = (server.masterhost ? CONFIG_OOM_REPLICA : CONFIG_OOM_MASTER);

    serverAssert(process_class >= 0 && process_class < CONFIG_OOM_COUNT);

#ifdef HAVE_PROC_OOM_SCORE_ADJ
    // oom_score_adjusted_by_redis:标记 Redis 是否已修改过 OOM 分数。
    // oom_score_adj_base:保存原始 OOM 分数,以便回滚或禁用时恢复。
    staticint oom_score_adjusted_by_redis = 0;
    staticint oom_score_adj_base = 0;

    int fd;
    int val;
    char buf[64];
    // oom_score_adj 不为 no
    if (server.oom_score_adj != OOM_SCORE_ADJ_NO) {
        // 第一次修改时,备份原始 oom_score_adj
        if (!oom_score_adjusted_by_redis) {
            oom_score_adjusted_by_redis = 1;
            /* Backup base value before enabling Redis control over oom score */
            fd = open("/proc/self/oom_score_adj", O_RDONLY);
            if (fd < 0 || read(fd, buf, sizeof(buf)) < 0) {
                serverLog(LL_WARNING, "Unable to read oom_score_adj: %s", strerror(errno));
                if (fd != -1) close(fd);
                return C_ERR;
            }
            oom_score_adj_base = atoi(buf);
            close(fd);
        }
        // 获取配置的 OOM 分数
        val = server.oom_score_adj_values[process_class];
        // 如果是相对模式,累加原始值
        if (server.oom_score_adj == OOM_SCORE_RELATIVE)
            val += oom_score_adj_base;
        // 限制值在 [-1000, 1000]
        if (val > 1000) val = 1000;
        if (val < -1000) val = -1000;
    } elseif (oom_score_adjusted_by_redis) {
        // 如果配置禁用 OOM 调整且之前已修改过,恢复原始值
        oom_score_adjusted_by_redis = 0;
        val = oom_score_adj_base;
    }
    else {
        return C_OK;
    }

    snprintf(buf, sizeof(buf) - 1, "%d\n", val);
    // 写入 /proc/self/oom_score_adj,使内核生效
    fd = open("/proc/self/oom_score_adj", O_WRONLY);
    if (fd < 0 || write(fd, buf, strlen(buf)) < 0) {
        serverLog(LL_WARNING, "Unable to write oom_score_adj: %s", strerror(errno));
        if (fd != -1) close(fd);
        return C_ERR;
    }

    close(fd);
    return C_OK;
#else
    /* Unsupported */
    return C_ERR;
#endif
}

具体实现上,系统的原始 OOM 值通过读取/proc/self/oom_score_adj获取。

在第一次启用 OOM 调整时,Redis 会将该原始值保存到 oom_score_adj_base 中,以便在后续禁用配置或发生配置回滚时,能够将进程的 OOM 值恢复为调整前的状态。

无论是相对模式还是绝对模式,最终生效的 OOM 值都会写回到/proc/self/oom_score_adj

需要注意的是,oom-score-adj-values 允许配置的取值范围为 [-2000, 2000],而 Linux 内核实际支持的 oom_score_adj 范围仅为[-1000, 1000]。

之所以放宽配置范围,是为了更好地支持相对模式(relative):在相对模式下,配置值会与系统原始 OOM 值进行叠加,叠加后的结果再被裁剪到内核允许的范围内,从而在不同系统初始 OOM 设置下仍能保持合理、可控的调整效果。 

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

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

相关文章

技术日报|AionUi多模型GUI登顶,本地化AI工具热度不减

&#x1f31f; TrendForge 每日精选 - 发现最具潜力的开源项目 &#x1f4ca; 今日共收录 9 个热门项目&#xff0c;涵盖 49 种编程语言&#x1f310; 智能中文翻译版 - 项目描述已自动翻译&#xff0c;便于理解&#x1f3c6; 今日最热项目 Top 10 &#x1f947; iOfficeAI/Aio…

SGMICRO圣邦微 SGM8291AYN5G/TR SOT23 运算放大器

特性 .低功耗:每放大器150pA .低失调电压:1.5mV(最大值) .宽输入共模电压范围 .低输入偏置和失调电流 .输出短路保护 *.轨到轨输出 .高输入阻抗 .高斜率:7V/us.小型封装: SGM8291可提供绿色封装:SOT-23-5、MSOP-8和SOIC-8 SGM8292有绿色MSOP-8和SOIC-8封装可选SGM8294有绿色TSS…

RG_PovX终极指南:精通第一人称视角插件的完整教程

RG_PovX终极指南&#xff1a;精通第一人称视角插件的完整教程 【免费下载链接】RG_PovX 项目地址: https://gitcode.com/gh_mirrors/rg/RG_PovX RG_PovX是一款革命性的第一人称视角插件&#xff0c;能够彻底改变你的游戏体验&#xff0c;让你真正从角色的眼睛观察游戏世…

SGMICRO圣邦微 SGM8478-1CXS8G/TR SOIC-8 运算放大器

特性 .低失调电压:16pV(最大值) .输入信号范围: (-Vs)至0.1V,或(Vs)至1V(适用于双电源供电)接地:单电源时为-0.1V至(Vs)1V 增益:50V/V .PSRR:0.05uV/V(典型值) 共模抑制比:106dB(典型值) 0.1Hz至10Hz噪声:0.75VRMS 输入电压噪声密度:在1kHz时为39nV/Hz -3dB带宽:230kHz 轨到轨输…

艾尔登法环存档定制大师:5分钟打造完美游戏角色

艾尔登法环存档定制大师&#xff1a;5分钟打造完美游戏角色 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor 还在为角色属性分配不当而烦恼&…

2026年板材品牌推荐:国际知名十大品牌深度对比,聚焦环保与实木板选购痛点 - 品牌推荐

2026年,随着消费者对居家健康与品质生活的追求持续深化,家居装修板材的选择已成为决定居住环境安全与舒适度的核心环节。但当前市场中板材品牌众多,从拥有国际知名度的综合集团到深耕细分品类的专业品牌,消费者面临…

SGMICRO圣邦微 SGM8521XN5/TR SOT-23-5 运算放大器

特性 .低成本轨到轨输入和输出典型输出电压0.8mV 单位增益稳定增益带宽积:150千赫兹极低输入偏置电流:0.5pA工作电压范围为2.1V至5.5V电源输入电压范围-0.1V至5.6V&#xff0c;Vs5.5V时低供电电流:每放大器4.7uA小型封装 SGM8521有SO-8和SOT23-5封装可选SGM8522有SO-8和MSOP-8封…

Habitat-Sim 3D模拟器实战避坑手册:从零到精通的完整路径

Habitat-Sim 3D模拟器实战避坑手册&#xff1a;从零到精通的完整路径 【免费下载链接】habitat-sim A flexible, high-performance 3D simulator for Embodied AI research. 项目地址: https://gitcode.com/GitHub_Trending/ha/habitat-sim 想要快速掌握Habitat-Sim这款…

SGMICRO圣邦微 SGM8535BYN5G/TR SOT23-5 运算放大器

特性 .轨到轨输出 .低输入失调电压:0.6mv(典型值) .一阶增益稳定 .增益带宽积:1.5MHz .供电电压范围:1.8V至5.5V .低供电电流80uA/放大器(典型值) SGM8537的关断电流为0.1uA .小型封装: SGM8535可选封装:S0T-23-5、SC70-5、SOIC-8和MSOP-8 SGM8536可选MSOP-8和SOIC-8封装SGM853…

2026年市面上专业的管家婆软件系统口碑排行,用友 T3/协同云/好生意/财务云/税务云/制造云,管家婆软件服务商价格 - 品牌推荐师

行业背景:企业数字化转型加速,SaaS管理软件需求激增 随着全球企业数字化转型进入深水区,中小微企业对高效、低成本的SaaS管理软件需求持续攀升。据IDC最新报告,2025年中国SaaS市场规模突破1200亿元,年复合增长率达…

BetterJoy终极指南:在Windows系统上完美使用Switch控制器

BetterJoy终极指南&#xff1a;在Windows系统上完美使用Switch控制器 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.c…

算法竞赛备考冲刺必刷题(C++) | 洛谷 P1281 书的复制

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…

终极部署指南:零门槛玩转轻量AI视觉助手

终极部署指南&#xff1a;零门槛玩转轻量AI视觉助手 【免费下载链接】moondream 项目地址: https://gitcode.com/GitHub_Trending/mo/moondream 你是否曾梦想拥有一双能看懂世界的AI眼睛&#xff1f;现在&#xff0c;这个梦想可以实现了&#xff01;Moondream作为一款超…

py之正则表达式去除空白符号

data11 22 33 44 55 66 77 88 99 aa bbccddeeff AA aa resre.findall(\S,data) print(.join(res))

2026年板材品牌综合推荐与深度解析:聚焦环保、实木与多层板市场格局 - 品牌推荐

一、板材品牌综合评估框架 本研究通过四维评分模型对市场主流板材品牌进行系统评估,各维度权重及核心评估指标如下: 1.产品与环保技术能力(30%):涵盖环保等级先进性、基材种类丰富度、核心技术专利水平及产品性能…

超强实战指南:用UABEA轻松解锁Unity游戏资源宝藏

超强实战指南&#xff1a;用UABEA轻松解锁Unity游戏资源宝藏 【免费下载链接】UABEA UABEA: 这是一个用于新版本Unity的C# Asset Bundle Extractor&#xff08;资源包提取器&#xff09;&#xff0c;用于提取游戏中的资源。 项目地址: https://gitcode.com/gh_mirrors/ua/UAB…

20.旋转图像

48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1:输入:mat…

基于粒子群算法与PO扰动相结合的优化策略在光伏MPPT中的应用:加入终止条件与重启功能的研究

光伏mppt&#xff0c;粒子群算法PO扰动结合优化mppt&#xff1a; 加入了终止条件与重启功能 先用粒子群算法定位到最优占空比附近&#xff0c;当粒子集中到一定范围&#xff0c; 再启用PO扰动进行快速稳定定位最优占空比 可&#xff0c;提供参考文献光伏系统里的MPPT技术就像在…

2026年成都月嫂培训机构推荐:基于多维度实测评价,针对服务标准与认证痛点指南 - 品牌推荐

如何为不同职业阶段选月嫂培训?2026年成都月嫂机构评测与推荐,直击质量与出路痛点 月嫂培训哪家更专业?2026年成都月嫂培训机构推荐与排名,解决实操与就业衔接难题 正文: 2026年成都月嫂培训机构评测与推荐榜单 摘…

探索WeMod专业版特权:解锁游戏辅助新体验

探索WeMod专业版特权&#xff1a;解锁游戏辅助新体验 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 还在为游戏修改工具的功能限制而苦恼&…