
Redis 源码编译安装笔记首先说明一下在Linux上编译安装软件包都是大同小异的。这里以树莓派为例在树莓派上编译 Redis 8.8.0 的过程记录包括依赖、编译选项、踩坑、配置、systemd 和卸载。顺便把内存分配器的选择逻辑也理了一遍。为什么源码安装某些发行版自带的 Redis 版本偏旧而你想用最新稳定版或者是特定版本。想指定安装路径或者定制编译选项比如选择内存分配器。纯粹想了解 Redis 的构建过程方便以后自己排查问题。树莓派这类 ARM 设备源码编译可以针对本地 CPU 做优化。安装编译依赖先装好基础工具Debian/Ubuntu树莓派 OS 同理sudoaptupdatesudoaptinstall-ybuild-essentialwgetCentOS/RHEL 用 yumsudoyuminstall-ygccmakewget获取源码并编译下载稳定版源码包wgethttps://download.redis.io/redis-stable.tar.gztar-xzvfredis-stable.tar.gzcdredis-stable编译# 如果系统有 jemalloc 头文件直接makemake-j$(nproc)# 如果报 jemalloc 相关错误就用libcmakeMALLOClibc -j$(nproc)-j$(nproc)# 用满所有 CPU 核心加快编译速度。编译的几个细节make clean与make distcleanmake clean只删.o和可执行文件保留 Makefile 生成的依赖缓存。make distclean清理得更彻底连依赖缓存一起删。如果你切换了内存分配器比如从 jemalloc 切到 libc一定要先make distclean否则残留的依赖信息会导致编译混乱。编译出的文件去哪了编译完成后可执行文件在src/目录下。make install只是把这些文件复制到系统目录。常见的编译报错fatal error: jemalloc/jemalloc.h: No suchfileor directory原因系统没有 jemalloc 头文件而 Redis 默认使用 jemalloc。两种处理方式简单make distclean make MALLOClibc彻底安装libjemalloc-dev然后make distclean makeimplicit declaration offunction‘je_malloc_usable_size’这个报错通常是因为之前编译过 jemalloc 版本但后来切到 libc 时没做distclean。执行make distclean再重新编译即可。经验凡是遇到分配器相关的奇怪报错先make distclean再重来能省很多时间。内存分配器jemalloc 与 libcRedis 自己不做内存池直接调用系统级的内存分配器。分配器的性能直接影响 Redis 的内存使用效率和碎片率。Redis 默认的选择逻辑在 Linux 上默认用jemalloc其他平台macOS、BSD默认用libc malloc。为什么 Linux 偏爱 jemalloc主要原因是 jemalloc 在多线程场景下碎片率更低能更有效地利用内存。什么是内存碎片简单说你分配和释放内存的次数多了内存中会出现很多不连续的空闲小块。当你要申请一块连续大内存时虽然总空闲量够但因为没有连续空间分配失败。jemalloc 通过更细粒度的分配尺寸和更好的回收策略减少这种情况。三种主流分配器对比分配器特点适用场景ptmallocglibc 默认最通用兼容性好但大并发下性能一般通用场景jemalloc碎片控制好并发扩展性强Redis 官方推荐高并发、大内存服务tcmallocGoogle多核优化不错但大内存分配时 CPU 可能偏高多核 CPU 密集型场景大多数场景下直接用 jemalloc 就好。如果懒得装依赖MALLOClibc也能跑性能差距在普通负载下几乎感觉不到。安装到哪个目录默认安装到/usr/local/binsudomakeinstall这样redis-server、redis-cli等命令就直接在 PATH 里了。如果想统一管理可以指定PREFIXsudomakePREFIX/usr/local/redisinstall此时可执行文件在/usr/local/redis/bin/需要手动把该目录加入PATH。/usr/local/bin是 FHS 标准里“用户自行编译安装的程序”的推荐位置和包管理器安装的/usr/bin区分开。make install后出现类似以下字段就是安装成功了。Hint: Its a good idea to run maketest;)INSTALL redis-server INSTALL redis-benchmark INSTALL redis-cli配置文件复制默认配置文件到/etc/redis/sudo mkdir -p /etc/redis sudo cp /解压路径/redis.conf /etc/redis/需要关注的配置项编辑/etc/redis/redis.conf配置项推荐值说明daemonizeyes后台运行bind127.0.0.1 或 0.0.0.0监听地址外网访问务必设密码requirepass强密码生产环境必须dir/var/lib/redis数据持久化目录需提前创建logfile/var/log/redis/redis.log日志文件可选启动与验证前台调试redis-server /etc/redis/redis.conf--daemonizeno看到Ready to accept connections就说明配置没问题按 CtrlC 退出。后台运行方法一启动时加--daemonize yesredis-server /etc/redis/redis.conf --daemonize yes方法二配置文件里把daemonize设为yes然后直接redis-server /etc/redis/redis.conf检查进程ps aux | grep redis-server连接测试redis-cli ping # 返回 PONG redis-cli set a b redis-cli get a如果设了密码redis-cli-a密码# 或进入后 auth 密码systemd 服务开机自启源码安装不带 systemd 单元需要自己写一个。创建/etc/systemd/system/redis.service[Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typesimple Userroot Grouproot ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop/usr/local/bin/redis-cli shutdown Restartalways LimitNOFILE65536 [Install] WantedBymulti-user.target如果用了自定义PREFIX记得改ExecStart和ExecStop的路径。启用并启动sudosystemctl daemon-reloadsudosystemctlenableredissudosystemctl start redissudosystemctl status redis之后管理就方便了sudo systemctl start|stop|restart|status redis为什么源码安装没有自带 systemd 服务因为 Redis 源码是跨平台的它不知道你用的是 systemd、SysV init 还是 OpenRC。所以它只负责把二进制文件装好服务管理留给你自己根据系统来配。其实 Redis 源码utils/目录下有一个systemd-redis_server.service模板直接复制过来改改也能用。卸载源码安装没有make uninstall卸载就是手动删文件。先停服务sudo systemctl stop redis # 如果有 systemd # 或 redis-cli shutdown然后根据安装方式删文件默认安装/usr/local/bincd/usr/local/binsudorm-fredis-server redis-cli redis-benchmark redis-sentinel redis-check-rdb redis-check-aof 自定义 PREFIX如 /usr/local/redissudorm-rf/usr/local/redis配置和数据目录按需清理sudo rm -rf /etc/redis sudo rm -rf /var/lib/redis # 小心这会删掉所有持久化数据如果之前改过~/.bashrc加过 PATH把那行删掉。一键安装脚本交互式下面这个脚本会检测当前目录是否有源码包没有的话让你选默认版本还是自定义版本然后自动编译安装。编译安装很有可能会遇上各种各样的问题这里不太建议使用脚本进行安装。#!/bin/bash# Redis 源码编译安装交互脚本set-eDEFAULT_VERSION7.2.4INSTALL_PREFIX/usr/local/redisREDIS_URLIndex of /releases/info(){echo-e\033[32m[INFO]\033[0m$1;}error(){echo-e\033[31m[ERROR]\033[0m$1;exit1;}check_deps(){forcmdingccmakewget;doif!command-v$cmd/dev/null;thenerror缺少$cmd请安装 build-essential 和 wgetfidone}find_pkg(){lsredis-*.tar.gz2/dev/null|head-n1;}main(){check_depslocalpkg$(find_pkg)if[-n$pkg];theninfo发现已有包:$pkgread-p使用它? (y/n, 默认 y): useuse${use:-y}if[[$use!y$use!Y]];thenpkgfifiif[-z$pkg];thenecho请选择: 1) 默认版本$DEFAULT_VERSION2) 自定义版本read-p输入 1 或 2 (默认 1): choicechoice${choice:-1}if[$choice1];thenversion$DEFAULT_VERSIONelseread-p输入版本号 (如 6.2.14): version[-z$version]error版本号不能为空fiwget--show-progress${REDIS_URL}redis-${version}.tar.gzpkgredis-${version}.tar.gzfitar-xzvf$pkg/dev/nullcd${pkg%.tar.gz}makedistclean2/dev/null||true# 检测 jemalloc若无则自动使用 libcif[!-f/usr/include/jemalloc/jemalloc.h][!-f/usr/local/include/jemalloc/jemalloc.h];theninfo未检测到 jemalloc使用 libc 分配器makeMALLOClibc -j$(nproc)elsemake-j$(nproc)fisudomkdir-p$INSTALL_PREFIXsudomakePREFIX$INSTALL_PREFIXinstallsudomkdir-p/etc/redissudocpredis.conf /etc/redis/if!grep-q$INSTALL_PREFIX/bin~/.bashrc;thenechoexport PATH\$PATH:$INSTALL_PREFIX/bin~/.bashrc info已添加 PATH请执行 source ~/.bashrc 生效fiinfo安装完成echo启动:$INSTALL_PREFIX/bin/redis-server /etc/redis/redis.conf}if[$EUID-ne0];thenecho建议以 root 或 sudo 运行read-p继续? (y/n): ans[[$ans!y$ans!Y]]exit0fimain$保存为install_redis.shchmod x后sudo ./install_redis.sh执行。官方文档与参考官方源码安装说明Install Redis from Sourceredis.io/docs/latest/operate/oss_and_stack/install/archive/install-redis/install-redis-from-source/下载页面https://redis.io/downloadsredis.io/downloads命令参考https://redis.io/commandsredis.io/commands源码根目录的README文件包含编译选项和环境变量说明。utils/systemd-redis_server.service—— 官方 systemd 模板。jemalloc 官网jemallocjemalloc.net/最后说几句源码编译本身不复杂但容易在分配器选择和清理残留上卡住。记住两点一是切换分配器前先make distclean二是如果不确定直接用MALLOClibc省事。生产环境如果追求极致性能装好libjemalloc-dev让 Redis 默认用 jemalloc 就行。systemd 服务文件最好自己写一份毕竟开机自启和统一管理能省不少麻烦。以上过程在树莓派 OSDebian Bookworm上实测通过gcc 12.2。其他发行版大同小异包管理命令换一下就好。