Linux下PostgreSQL 12.0编译安装与配置实战
开头PostgreSQL 12.0这个版本虽然已经不算最新但我一直认为它是近年里“最值得部署的版本”之一——性能优化覆盖面广、分区表体验大幅改善、日志和监控机制也更成熟。到现在我身边还有不少生产环境跑在12.x上稳定得让人懒得升级。这篇博文就围绕Linux下的PostgreSQL 12.0安装部署展开从编译安装到基础配置再到日常启动管理和问题排查把整个流程掰开揉碎讲清楚。这篇文章适合谁一是刚接触PostgreSQL、想在Linux上从零搭一套库的新手二是被各种依赖、权限、配置坑过、想搞明白“为什么这样改”的运维同学三是需要写部署文档、把安装过程脚本化的开发。我会把每一步的操作意图和底层逻辑都讲出来而不是给你一段冷冰冰的命令序列——因为只复制命令而不理解原理换一台机器、换一个环境你照样会卡住。先说结论在Linux下部署PostgreSQL 12.0核心就三件事——选对安装方式、配好初始化参数、管好启动和认证。把这三件事吃透了剩下的都是细节问题。1. 安装前的准备工作与方案取舍1.1 环境清点先看系统再谈安装很多人上来就敲安装命令结果装到一半发现缺编译工具或者系统架构对不上折腾半天还得推翻重来。我习惯先花两分钟把环境摸清楚省下的时间远比这两分钟多。需要确认的信息至少有这几项操作系统发行版和版本不同发行版的包管理器和依赖库名称差异很大CentOS用yum、Debian/Ubuntu用apt哪怕都叫“Linux”后面的坑也不一样。系统架构x86_64还是ARM这决定了下载的源码包或二进制包版本。PostgreSQL官方对主流架构支持都很好但你提前确认一下能少走弯路。当前是否已有PostgreSQL残留用rpm -qa | grep postgres或dpkg -l | grep postgres扫一遍有残留的话先清理避免端口、数据目录、服务配置冲突。是否有足够磁盘空间源码编译安装需要大约300MB临时空间数据目录解压后空库大概几十MB但要考虑后续业务增长。df -h看一眼至少留出几十GB才踏实当然具体看业务量。我遇到过一次比较典型的情况在一台存量服务器上装PostgreSQLpsql命令能执行但版本是9.x而且旧数据目录还占着默认端口5432。新装的12.0一直启动失败查了半天发现是旧服务占用端口。所以检查这一步千万别省特别是存量环境。1.2 安装方式二选一源码编译还是包管理器PostgreSQL在Linux下的安装方式主要有三种我把它们的优缺点列成了一张表方便你做决策安装方式优点缺点适合场景发行版包管理器yum/apt安装快、依赖自动处理、和系统集成好版本通常滞后不一定有12.0配置路径跟随系统约定测试环境、对版本不敏感的场景官方二进制仓库PGDG版本新且由官方维护、与系统软件兼容性好需要额外配置yum/apt源有时源访问速度慢生产环境推荐兼顾效率和可控性源码编译安装版本完全可控、可定制编译选项、路径自定义耗时长、依赖要自己解决、升级要重新编译定制化需求强、需要特定版本的学习/研究环境接下来的博文核心以“源码编译安装”为主线因为这是最能看清PostgreSQL内部结构、也最容易出细节问题的方式。源码编译看着麻烦但只要你把每个参数的含义搞懂它反而是一种“心里最踏实”的安装方法——所有东西放在哪、用什么参数启动的你全都知道出了问题也最容易定位。提示如果你只是想快速搭一个环境跑业务直接用包管理器安装再配合initdb初始化即可不一定要编译源码。2. 编译安装PostgreSQL 12.0全流程2.1 依赖库先行少了它们后面全是坑源码编译安装的第一步不是下载源码而是确认编译工具和依赖库。PostgreSQL 12.0编译最基础的依赖有这些gcc、make编译器和构建工具没有它们后面寸步难行。readline-devel提供命令行历史记录和编辑功能。没有它psql交互体验会非常差而且configure阶段会直接报错退出。zlib-devel压缩库数据备份、归档等功能会用到。在CentOS/RHEL系统上一条命令装齐yum install -y gcc make readline-devel zlib-develDebian/Ubuntu系统则是apt-get install -y build-essential libreadline-dev zlib1g-dev如果你后续要用PostgreSQL的SSL功能还需要openssl-devel要用Python写PL/Python需要python3-devel。这里我建议“按需安装”而不是“全装”——装得越多configure阶段的检查项越多反而更容易因为某个库缺失而失败。基础的三个库先装好后面需要什么再补。为什么PostgreSQL这么依赖readline因为psql是一个交互式命令行工具需要支持光标移动、历史命令回退等编辑功能readline恰好提供了这套能力。没有readline虽然也能编译成功configure检测不到readline会自动禁用该功能但psql用起来就像回到几十年前的终端体验极差。2.2 解压、配置、编译、安装的四个关键阶段源码安装的流程可以概括为四步解压、configure、make、make install。每一步都有它自己的作用和坑我逐一说明。首先获取源码包。PostgreSQL官方下载页提供了12.0的源码包文件名一般是postgresql-12.0.tar.gz。内网环境就把这个包提前下载好传到目标服务器。解压tar -zxvf postgresql-12.0.tar.gz cd postgresql-12.0接下来是configure这是整个编译过程中最关键的一步。它负责检测系统环境、检查依赖库、并生成Makefile。我实际生产常用的配置命令是./configure --prefix/opt/pgsql12 \ --with-pgport5432 \ --with-openssl \ --enable-nls这里每个参数都有讲究--prefix/opt/pgsql12安装路径。我习惯把PostgreSQL装在独立的/opt/pgsql12目录下而不是默认的/usr/local/pgsql。这样做的原因是升级时整个目录可以直接替换不会污染系统目录卸载也方便——删掉这个目录就行。--with-pgport5432默认端口。虽然默认就是5432但显式写出来能让生成的配置更明确后人看Makefile和配置也少猜一步。--with-openssl启用SSL支持生产环境强烈建议打开。--enable-nls启用国际化消息支持即错误提示可以显示多语言。纯内网环境不开启也可以。configure执行完毕后看输出末尾有没有configure: error字样。如果出现错误通常它会明确提示缺哪个库按提示补装即可。编译的命令是make -j4-j4表示并行编译4是你的CPU核数。如果你机器是8核-j8会更快但不要盲目加大曾经我的机器并发太大导致内存不足编译进程被系统杀掉白白浪费了时间。核数太大时建议用-j$(nproc)动态获取核数但也要留意内存占用。编译完成后用root权限执行安装make install安装完成后检查/opt/pgsql12/bin目录你会看到postgres、initdb、pg_ctl、psql等二进制文件都在这里了。到了这一步编译安装的核心流程就算结束真正的工作才刚刚开始。2.3 一键脚本化运维的偷懒艺术如果是多台服务器都要部署或者以后还要复盘重建环境我强烈建议把整个编译安装过程写成一个Shell脚本。一来可以避免人手动敲命令敲错二来在故障复盘时拿着脚本就能追溯到当时到底装了哪些参数。下面是一个我常用的部署脚本骨架#!/bin/bash # PostgreSQL 12.0 源码编译安装脚本 set -e PG_VERSION12.0 PREFIX/opt/pgsql12 SRC_DIR/usr/local/src yum install -y gcc make readline-devel zlib-devel cd $SRC_DIR tar -zxvf postgresql-${PG_VERSION}.tar.gz cd postgresql-${PG_VERSION} ./configure --prefix${PREFIX} --with-pgport5432 --with-openssl make -j$(nproc) make install # 创建普通用户和文件权限 id postgres || useradd -m -s /bin/bash postgres mkdir -p /opt/pgsql12/data chown -R postgres:postgres /opt/pgsql12这里要特别强调set -e的作用脚本中任意一条命令失败整个脚本立即退出不会带着错误继续往下执行。这能避免“编译失败但脚本继续走、最后安装一个残缺版本”的尴尬局面。脚本里我还做了一件事——创建postgres用户。PostgreSQL官方强烈建议用非root用户运行数据库服务这是出于安全考虑即便数据库被攻破攻击者也拿不到root权限。而且PostgreSQL本身也拒绝用root身份运行initdb和启动服务所以创建一个专用用户是必须的。3. 数据目录初始化与配置调优3.1 initdb初始化数据库实例的“成年礼”编译装好二进制文件之后数据库还不能直接使用必须先用initdb命令在数据目录中创建一套完整的数据库实例文件。这就像你买了一台新电脑还得装操作系统才能开机——数据目录里的base、global、pg_xact等子目录就是PostgreSQL的“操作系统文件”。初始化之前先手动创建数据目录并授权。注意一定要确保数据目录的所有者是postgres用户否则后面启动会报权限错误。mkdir -p /opt/pgsql12/data chown -R postgres:postgres /opt/pgsql12然后切换到postgres用户执行initdb。初始化命令是这样su - postgres /opt/pgsql12/bin/initdb -D /opt/pgsql12/data \ -U postgres \ --encodingUTF8 \ --localeen_US.UTF-8 \ --authscram-sha-256initdb的参数我一个个解释-D指定数据目录必须和启动时配置的目录一致否则服务找不到数据。-U指定超级用户的用户名默认是postgres。这个超级用户相当于数据库的root拥有所有权限。--encodingUTF8数据库默认字符集。强烈建议用UTF8否则后面存中文、存emoji都可能出现乱码。--localeen_US.UTF-8区域设置会影响排序规则、文本比较行为。这里有个易错点如果系统本身没装en_US.UTF-8语言包initdb会报错。可以用locale -a先检查系统支持的locale没有就退而求其次用C或POSIX。开发测试环境用C反而省心排序性能也高一些。--authscram-sha-256设置默认的认证方式。这是PostgreSQL 10之后引入的强密码认证协议比以前的md5安全得多。既然是新建库直接上最安全的方案别给自己留安全隐患。初始化成功的标志是日志里出现“Success. You can now start the database server”这样的信息。如果看到这个恭喜数据库实例的基础骨架已经完成。3.2 postgresql.conf关键参数照着配就行初始化完成后数据目录下会生成三个核心配置文件postgresql.conf主配置、pg_hba.conf访问认证配置、pg_ident.conf用户名映射配置。大部分情况下你只需要动前两个。postgresql.conf里的参数很多但90%的场景只需要关注以下几类。先说监听与连接相关listen_addresses 0.0.0.0 port 5432 max_connections 100listen_addresses决定数据库监听哪些网络接口。默认是localhost只能本机访问。如果你要让其他机器连这个库必须改为0.0.0.0监听所有网卡或指定具体IP。这个参数改完必须重启数据库才生效。max_connections是最大并发连接数默认100。这里要提醒一句连接数不是拍脑袋定的它受共享内存大小和每个连接的开销制约。PostgreSQL中每个连接大约占用几MB内存如果你开1000个连接而机器只有8GB内存数据库很可能内存不足直接崩溃。一般经验是并发连接需求超过200时前端加连接池如PgBouncer而不是无限调大max_connections。再说内存相关参数这是PostgreSQL性能调优的重头戏shared_buffers 1GB effective_cache_size 3GB work_mem 4MBshared_buffers是数据库共享缓冲区大小用于缓存数据页。官方建议设置为系统物理内存的25%左右。比如机器16GB内存可以设4GB。注意不要超过这个比例——给共享缓冲区分配的内存会一直占用不会自动释放设太大反而挤占系统和其他进程的内存。effective_cache_size不是PostgreSQL实际占用的内存而是告诉查询规划器“系统层面有多少内存可以用来做文件缓存”。它不消耗真实内存只是影响查询计划的优化策略。一般设置为总内存的50%~70%。work_mem是单个查询用于排序、哈希操作的内存上限。这个参数需要小心它虽然是“每个操作”的限制但一个复杂查询可能有多个排序操作并发时累加会相当可观。4MB是保守值如果你有充足内存可以调到8~16MB。我见过有人把work_mem设成512MB结果十几个并发查询直接把内存打满数据库直接OOM。改这个参数要小额多次地压测不要一步到位。最后说WAL和日志相关wal_level replica max_wal_senders 10 logging_collector on log_directory log log_filename postgresql-%a.log log_statement ddlwal_level replica是生产环境的底线配置支持WAL归档和流复制的基本要求。max_wal_senders是流复制需要的发送进程数单机不搞主从的话保持默认即可。logging_collector on表示把日志收集到文件里不要只输出到终端。log_statement ddl表示只记录DDL语句建表、删表等不记录普通查询——这样既能追踪结构变更又避免了海量查询日志把磁盘塞满。修改配置文件前建议先备份原文件cp /opt/pgsql12/data/postgresql.conf /opt/pgsql12/data/postgresql.conf.bak这是个好习惯改配置之前永远留一手改出问题了还能快速回滚。3.3 pg_hba.conf数据库的“门禁系统”pg_hba.confhost-based authentication是PostgreSQL的客户端访问认证配置文件相当于数据库的“门禁系统”。初次配置时最让人困惑的就是各种认证方式的异同。常见的认证方式有三种trust完全信任、md5密码用MD5加密、scram-sha-256更安全的密码加密。我在生产环境从不用trust它意味着任何能连到端口的人都能免密登录特别是面对公网环境时这等于裸奔。开发环境图方便可以用但一定要清楚风险。一个常用的生产配置模板长这样# 本地Unix套接字连接使用scram认证 local all all scram-sha-256 # IPv4本地回环允许本机密码登录 host all all 127.0.0.1/32 scram-sha-256 # 内网网段允许应用服务器连接 host all all 192.168.1.0/24 scram-sha-256 # 禁止其他来源连接 host all all 0.0.0.0/0 reject注意pg_hba.conf的匹配规则是“自上而下命中即止”。所以要放宽的规则放前面要拒绝的放后面顺序反了会导致策略不生效。最后一行reject相当于兜底拦截保证除了明确允许的网段其它来源一律拒绝。改完pg_hba.conf后不需要重启数据库只需要重新加载配置/opt/pgsql12/bin/pg_ctl reload -D /opt/pgsql12/datareload和restart的区别需要理解reload只重新读取配置文件不中断当前连接适用于pg_hba.conf这类访问控制变更restart会中断所有连接适用于listen_addresses、shared_buffers这类只有启动时才能生效的参数变更。区分这两个操作是数据库运维的基本功可以避免很多不必要的业务中断。3.4 环境变量每天都要用到的东西安装完成后把PostgreSQL的bin目录加入PATH并把PGDATA环境变量配置好能大幅提升日常操作效率。配置写在postgres用户的~/.bash_profile里echo export PATH/opt/pgsql12/bin:$PATH ~/.bash_profile echo export PGDATA/opt/pgsql12/data ~/.bash_profile source ~/.bash_profile设置PGDATA后很多命令的精简写法就能用了——比如pg_ctl start后面不需要每次带-D参数直接认环境变量里的数据目录。psql也会自动找到数据目录和后期设置的配置文件少敲很多路径。这里强调一个我自己踩过的坑PATH里把/opt/pgsql12/bin放在$PATH前面是为了确保psql、pg_ctl等命令优先使用新版本的二进制文件而不是系统自带的旧版本。我曾经因为PATH顺序不对敲psql用的还是老版本客户端执行命令时和12.0服务端行为不一致排查了半天才发现是PATH顺序问题。4. 启动、停止与开机自启4.1 手动起停的正确姿势先看进程再动手数据库初始化完成后第一件事就是启动服务验证。启动命令很简单su - postgres /opt/pgsql12/bin/pg_ctl start -D /opt/pgsql12/data -l /opt/pgsql12/data/logfile这里-l参数指定了日志输出文件没有它启动日志会打到标准输出一旦终端断开就看不到日志了。启动后建议立刻用一条命令验证状态/opt/pgsql12/bin/pg_ctl status -D /opt/pgsql12/data正常输出会包含pg_ctl: server is running (PID: xxxx)等信息。更可靠的验证方式是用psql连上去执行一条简单查询psql -U postgres -c SELECT version();能返回PostgreSQL 12.0版本信息说明实例健康可用。如果连接时报错优先级最高的排查点是看日志文件——PostgreSQL的日志会明确告诉你失败原因比如端口被占用、数据目录权限不对、内存参数超出限制等比对着错误码瞎猜有效得多。停止数据库的优雅方式/opt/pgsql12/bin/pg_ctl stop -D /opt/pgsql12/data -m fast-m fast表示快速模式停止回滚未完成的事务断开所有连接正常关闭。还有个-m immediate相当于强制断电只在紧急情况下使用因为它可能导致需要重放WAL日志恢复。我见过有人图省事直接用kill杀进程这是最危险的——PostgreSQL进程被杀时可能来不及刷盘重启后拖出损坏的数据页恢复成本极高。除非数据库完全卡死否则别用kill。4.2 配置systemd服务让数据库自动复活手动启动没问题但服务器重启后数据库不会自动恢复每次手动起服务太被动。生产环境应该配置systemd服务让PostgreSQL随系统自启。在/etc/systemd/system/postgresql-12.service创建服务文件[Unit] DescriptionPostgreSQL 12.0 database server Afternetwork.target [Service] Typeforking Userpostgres Grouppostgres ExecStart/opt/pgsql12/bin/pg_ctl start -D /opt/pgsql12/data -l /opt/pgsql12/data/logfile ExecStop/opt/pgsql12/bin/pg_ctl stop -D /opt/pgsql12/data -m fast ExecReload/opt/pgsql12/bin/pg_ctl reload -D /opt/pgsql12/data PIDFile/opt/pgsql12/data/postmaster.pid [Install] WantedBymulti-user.target关键点在于Typeforking因为pg_ctl start会fork出一个后台服务进程然后立即返回systemd必须知道子进程的PID才能管理服务生命周期所以PIDFile参数指向postmaster.pid文件——这个文件记录了PostgreSQL主进程的PID。配置完成后执行systemctl daemon-reload systemctl enable postgresql-12 systemctl start postgresql-12 systemctl status postgresql-12enable会把服务加入到开机自启列表。status命令输出active (running)表示服务正常。以后重启服务器PostgreSQL会自动跟随系统启动不需要人工干预。用systemd管理数据库还有一个额外好处日志可以被systemd的journald统一管理journalctl -u postgresql-12就能查看全部服务日志排查问题方便很多。4.3 日志管理磁盘被日志撑爆是真实发生过的事PostgreSQL开启logging_collector后日志文件会持续增长。如果不做轮转清理日志占满磁盘是早晚的事。这块如果不提前规划等到磁盘满时数据库会进入只读模式业务直接遭殃。我的习惯是开启日志轮转配置在postgresql.conf中log_truncate_on_rotation on log_rotation_age 1d log_rotation_size 100MB含义是日志每天轮转一次或者单个文件超过100MB就轮转。log_truncate_on_rotation on表示轮转时覆盖旧日志而不是追加避免日志文件累积成无限大的单个文件。同时建议在系统层面做crontab定期清理比如保留30天的日志find /opt/pgsql12/data/log -name postgresql-*.log -mtime 30 -delete把这个命令写进crontab每日执行。日志这块看起来不起眼但真到故障发生时有历史日志可用和没日志可用排查效率天差地别。保留30天是一个性价比比较高的平衡点既不会占用太多磁盘也保留了足够的回溯窗口。5. 常见问题与排查技巧实录5.1 权限与依赖问题initdb和编译阶段的重灾区症状一initdb提示“cannot be run as root”。这是PostgreSQL的安全设计不是bug。解决办法就是切换到postgres用户再执行或者用su - postgres -c包装命令。从设计角度理解数据库服务绝不允许以最高权限运行这是纵深防御的一部分切用户就对了。症状二configure阶段提示readline.h not found或zlib.h not found。说明缺少对应的-devel包用包管理安装后重新configure。注意make到一半报缺头文件的情况此时不需要全部重新make补装依赖后重新执行configure再make即可增量编译会自动跳过已完成的文件。5.2 启动失败排查日志是唯一可信的灯塔症状三pg_ctl start报could not bind IPv4 socket: Permission denied。这通常是端口被占用。用ss -tlnp | grep 5432查看哪个进程占用了5432端口然后处理掉占用进程或修改PostgreSQL端口。症状四启动时报FATAL: lock file postmaster.pid already exists。这是上次数据库异常退出留下的PID文件。解决方案是确认没有postgres进程在运行ps aux | grep postgres确认无残留然后删除/opt/pgsql12/data/postmaster.pid再启动。注意先确认进程真的不在了再删PID文件否则可能影响一个正在运行的实例。症状五数据库启动成功但本地连不上报no pg_hba.conf entry。这是pg_hba.conf里没有匹配的认证规则。确认你连接时用的用户、来源IP、连接方式然后在pg_hba.conf里添加匹配的条目reload即可。连接PostgreSQL时记住一个思路问题只可能出在三个环节——网络层面能否到达端口、认证层面pg_hba.conf是否允许、权限层面用户是否有权访问该库。从这三层逐层排查绝大多数连接问题都能定位。5.3 常见问题速查表我整理了一份高频问题速查表方便遇到问题时快速对照现象可能原因排查命令/方法解决思路initdb报cannot be run as root用了root身份切换postgres用户su - postgres后执行configure缺readline.h缺readline-devel安装依赖yum install readline-devel启动报Port被占用端口有进程监听ss -tlnp | grep 5432处理占用进程或改端口启动报postmaster.pid exists上次异常退出残留ps确认无postgres进程删除pid文件后启动本地连接报pg_hba.conf无条目认证规则未覆盖查看pg_hba.conf添加匹配的规则并reload远程连接超时防火墙拦截firewall-cmd --list-all放行5432端口或调整防火墙密码登录报认证失败客户端认证方式不匹配检查pg_hba.conf将auth改为scram-sha-256查询变慢且CPU高work_mem太小导致磁盘排序EXPLAIN ANALYZE适当调大work_mem日志快速占满磁盘未配置日志轮转du -sh /opt/pgsql12/data/log开启log_rotation并定期清理5.4 内存相关参数调优一次OOM事故的复盘最后聊一个让我印象深刻的调优案例。有一次同事反馈业务系统响应极慢数据库完全不干活的样子。检查系统内存发现几乎耗尽dmesg里有明显的OOM记录进程被系统杀掉了。复盘时发现罪魁祸首是shared_buffers被设置成了主机内存的80%远超合理值。同时max_connections被调到1000每个连接预分配的缓存加起来又吃掉了大量内存。两个参数叠加机器直接被榨干。PostgreSQL参数调优的一个基本心法先算后配。拿到一台服务器先看总内存然后按比例分配shared_buffers占25%、effective_cache_size占50%~70%、work_mem按并发数估算。比如16GB内存的机器shared_buffers 4GB # 16GB * 25% effective_cache_size 10GB # 约16GB * 60% work_mem 8MB max_connections 200这样配置的总额是4GB 8MB*200 ≈ 5.6GB加上系统本身和PostgreSQL后台进程的开销16GB内存仍然健康。调参后业务恢复平稳此后再没有出现过OOM。提示任何内存参数的调整改完都先pg_ctl restart再用top或free -h观察内存占用趋势。数据库刚启动时的内存占用会随着后续的查询缓存逐步增长不要只看启动瞬间的数值就下结论。写在最后经过这么多次部署我自己最大的体会是PostgreSQL的安装部署从来不是“把命令敲一遍”那么简单它的每一步都藏着权限模型、进程管理、内存分配这些计算机系统的基础原理。你愿意多想一层“为什么”后面排查问题的速度就会快一分。最后再分享一个小技巧配置完一套环境后用pg_ctl status配合psql -c show shared_buffers;和psql -c show max_connections;这类命令把当前生效的关键配置导出来存档。下次调优或者重建环境拿这份存档对照着来比翻聊天记录找当初改了啥靠谱得多。这一套流程走下来你对Linux服务和数据库之间的关系会有比读十本书都更直接的认识。

相关新闻

Python Selenium复用已打开Chrome实例的完整指南

Python Selenium复用已打开Chrome实例的完整指南

1. 项目概述:为什么“复用已打开的Chrome”比从零启动更值得深挖你有没有遇到过这种场景:写好了一段 Selenium 脚本,运行起来一切正常,但每次执行都得重新打开一个全新的 Chrome 窗口——登录态没了、Cookie 清空了、插件没加载、…

2026/10/14 18:19:43 阅读更多 →
Kiln AI Server 实战指南:REST API 服务与 MCP 工具服务器的安装、配置与二次集成

Kiln AI Server 实战指南:REST API 服务与 MCP 工具服务器的安装、配置与二次集成

人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用 【免费下载链接】Kiln Build, Evaluate, and Optimize AI Systems. Includes evals, RAG, agents, fine-tuning, synthetic data generation, dataset management, MCP, and more. 项目地址: https://gitcod…

2026/10/14 18:18:42 阅读更多 →
FreeRTOS可裁剪机制详解:从配置宏到内存优化的嵌入式实践

FreeRTOS可裁剪机制详解:从配置宏到内存优化的嵌入式实践

做嵌入式这几年,我反复在跟别人解释一个词: 可裁剪 。很多刚接触FreeRTOS的工程师,看到它的源码不过三五个文件,就觉得"小"是它的全部优点。其实"小"只是结果,"可裁剪"才是这背后真正…

2026/10/14 18:18:42 阅读更多 →

最新新闻

库存扣减的并发控制:乐观锁的应用

库存扣减的并发控制:乐观锁的应用

财务主管跨界写技术文,先交代缘由:公司商城搞限时促销,活动结束对账,账面库存和实物对不上,多卖了四十七件。排查一周,病根是库存扣减没做并发控制,两个请求同时读到同样的库存数,各…

2026/10/14 19:10:22 阅读更多 →
Python案例练习:图书管理系统

Python案例练习:图书管理系统

Python案例练习:图书管理系统、新增图书、查看所有图书、按书名搜索、修改图书信息、删除图书、保存数据到本地文件、从文件加载数据 """ 图书管理系统 新增图书、 查看所有图书、 按书名搜索、 修改图书信息、 删除图书、 保存数据到本地文件、 从文…

2026/10/14 19:10:22 阅读更多 →
防拍照泄密核心知识点合集精讲

防拍照泄密核心知识点合集精讲

在企业数据安全建设过程里,很多运维新人学习防泄密体系都是碎片化的。大多优先关注 U 盘拷贝、聊天软件外发、邮件附件导出这类传统泄密通道,很容易漏掉手机拍摄电脑屏幕这个低成本、高隐蔽性的泄密途径。很多企业投入预算搭建文档加密体系,管…

2026/10/14 19:10:22 阅读更多 →
Keepalived + DRBD 实现 NFS 文件服务高可用:架构、配置与避坑指南

Keepalived + DRBD 实现 NFS 文件服务高可用:架构、配置与避坑指南

简介:这份资源面向运维工程师与VoIP通信系统开发者,聚焦Freeswitch高可用架构的落地实践,通过Keepalived实现主备节点故障自动切换,解决单点故障导致通信服务中断的问题。压缩包共4个文件,约38KB,包含2个Sh…

2026/10/14 19:10:22 阅读更多 →
Reactor 3背压机制深度解析与生产级实践

Reactor 3背压机制深度解析与生产级实践

1. 项目概述:为什么背压不是“可选项”,而是Reactor 3的生存底线 你写完第一个 Flux.create() ,用 onNext() 疯狂发射数据,下游用 subscribe(System.out::println) 接收——一切丝滑。直到某天压测时,控制台突然…

2026/10/14 19:10:22 阅读更多 →
Python车险理赔车型识别与合规校验:数据工程实践指南

Python车险理赔车型识别与合规校验:数据工程实践指南

1. 项目背景与整体设计思路1.1 车型信息在车险理赔中的关键作用车险理赔看起来是“拍照—定损—打款”的简单流程,但真正做过车险数据的人都知道,车型信息是贯穿整个理赔链路的一个隐形骨架。从承保端的车型定价,到理赔端的配件价格与工时费计…

2026/10/14 19:09:21 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →