news 2026/9/30 11:50:39

Linux下安装Redis全攻略:环境准备、编译配置与生产实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux下安装Redis全攻略:环境准备、编译配置与生产实践

有时候运维工作拼的不是手速,而是规划。以我这些年帮客户搭建缓存服务的经验来看,安装 Redis 本身花的力气只占三成,剩下七成都花在版本选择、环境确认、参数预判这些“看不见的准备工作”上。很多新手上来就下载源码包、解压、make,装完才发现要么版本太老,要么 PID 文件目录不存在,要么被防火墙挡在门外,最后还是得回头补课。这篇文章就从最真实的部署流程出发,把 Linux 下安装 Redis 的完整链路拆开揉碎,包括环境准备、安装方式选型、配置项调优、开机自启、客户端连接,以及我在生产环境里真正踩过的坑。无论你是刚入门的运维新人,还是要自己搭一套缓存服务的后端开发,照着这套思路走基本不会翻车。

1. 部署前的摸底:不要急着敲命令

我在前面提到,安装 Redis 并不是“下载-编译-启动”这么简单。一个合理的部署节奏应该是:先搞清楚服务器是什么系统、什么 CPU 架构、有没有历史遗留的 Redis 进程或端口占用,再决定用哪种安装方式。磨刀不误砍柴工,这一步做扎实了,后面能省掉大量排查时间。

1.1 先确认 Linux 发行版和内核版本

不同发行版的软件生态差异很大,安装 Redis 的路径也完全不同。Debian/Ubuntu 系列的包管理器是 apt,CentOS/RHEL 系默认是 yum 或 dnf,OpenSUSE 用 zypper,Arch 系用 pacman。虽然我们最终可以选择源码编译,但我还是建议先执行几条命令把系统信息看清楚:

cat /etc/os-release uname -a nproc free -h

cat /etc/os-release能直接看到系统名称和版本号,uname -a可以确认内核版本和架构是 x86_64 还是 aarch64,nproc查 CPU 核数,free -h看内存。Redis 是单线程为主的程序,CPU 核数对单实例性能影响不像内存那么大,但内存大小直接决定你后面能不能开 RDB 持久化、能设置多大的 maxmemory。

这里有个经验:如果你拿到的是一台老旧的 CentOS 7 或者系统里 GCC 版本低于 8,安装 Redis 7.x 之前最好先考虑升级 GCC,或者干脆用 Docker 跑一个官方镜像,省去编译环境带来的麻烦。我在 6.x、7.x 上都遇到过因为编译器太旧导致编译中途失败的情况,后面在常见问题部分会详细说。

1.2 端口、用户和目录规划,越早定越好

Redis 默认端口是 6379,这个端口在公网环境下经常被扫描工具盯上,所以生产环境尽量不要裸奔在默认端口上,至少也要改成一个不常见的端口,再配合防火墙白名单。你可以在安装之前就想好:Redis 跑在哪个用户下、数据目录放哪里、日志放哪里、PID 文件放哪里。我通常的规划是这样的:

  • 运行用户:单独创建 redis 用户,不直接用 root
  • 安装目录:/usr/local/redis
  • 数据目录:/data/redis
  • 日志目录:/var/log/redis
  • PID 文件:/var/run/redis/redis.pid

为什么要单独建一个用户?因为 Redis 本身有 protected-mode,而且如果它被利用执行危险命令,低权限用户能造成的破坏要小得多。虽然很多人图省事用 root 跑,但在安全审计和实际攻防演练中,这种习惯是第一批被扣分的项。建用户的操作也很简单:

useradd -s /sbin/nologin redis mkdir -p /data/redis /var/log/redis /var/run/redis chown -R redis:redis /data/redis /var/log/redis /var/run/redis

-s /sbin/nologin表示这个用户不能登录 Shell,只用来跑服务,这是最小权限原则的落地。后面的目录权限如果给错,Redis 启动时会报Can't open the log file或者Can't chdir这类让人摸不着头脑的错误,实际上根源就是权限不够。

1.3 下载 Redis 源码包的正确姿势

拿到源码包有两种常见途径:去官网 redis.io 的下载页手动下载,或者直接在 Linux 服务器上用wget拉取。我习惯直接用 wget,因为省去本地下载再上传的步骤。需要注意,官网提供的下载地址一般长这样:

wget https://download.redis.io/releases/redis-7.2.4.tar.gz

下载之后记得解压:

tar xzf redis-7.2.4.tar.gz cd redis-7.2.4

解压出来的目录里就能看到README.md、Makefile、src、deps等目录。如果你下载的是带有rc后缀的候选版本,我建议不要在正式环境使用,RC 版本意味着还处于测试阶段,稳定性需要自己评估。下载完成后最好用sha256sum校验一下文件完整性,官方页面会给出对应的哈希值,这一步能避免下载损坏的包。

2. 三种安装方式对比,以及我为什么最常用源码编译

Redis 在 Linux 上常见的安装方式有三种:源码编译安装、包管理器安装、Docker 容器运行。它们各有适用场景,没有绝对的好坏。下面我逐个说清楚,再给出我的选型建议。

2.1 源码编译安装:适合生产环境,步骤最完整

源码编译是我最推荐的方式,尤其适合生产环境。它的最大优势是可控性:你可以选择任意版本,可以指定安装路径,可以按需裁剪编译选项。虽然步骤比包管理器多一点,但整套流程清晰,出问题时也容易定位。

正常的编译三部曲如下:

make distclean 2>/dev/null; make MALLOC=libc make -j$(nproc) make install PREFIX=/usr/local/redis

这里有个细节:Redis 默认使用 jemalloc 内存分配器,在某些系统上编译时会报jemalloc.h: No such file or directory,这时候加MALLOC=libc就可以绕过这个问题。不过不要害怕,我遇到的大部分情况其实是因为缺少编译基础组件,后面会有更详细的排查方法。

make -j$(nproc)的意思是让 make 并行编译,-j后面的数字是并行任务数,用nproc自动获取 CPU 核数,可以大幅缩短编译时间。在一台 8 核的机器上,Redis 7.x 的编译通常两三分钟就能完成。

编译完成之后,make install会把redis-server、redis-cli、redis-sentinel、redis-benchmark、redis-check-aof、redis-check-rdb这些可执行文件复制到/usr/local/redis/bin目录。你可以把/usr/local/redis/bin加入 PATH,方便后续执行命令:

echo 'export PATH=/usr/local/redis/bin:$PATH' >> /etc/profile.d/redis.sh source /etc/profile.d/redis.sh

源码编译的方式看着繁琐,但后续升级、回滚、多版本共存都很方便,这也是它在生产环境里能站稳脚跟的原因。

2.2 包管理器安装:快速省事,适合开发测试

如果你的需求是拿一台机器快速验证 Redis 功能,不追求特定版本,那么直接用系统自带的包管理器是最效率的。

在 Ubuntu/Debian 上:

apt update apt install redis-server -y

在 CentOS/RHEL 上:

yum install redis -y

包管理器安装完成后,服务通常已经被注册为 systemd 服务,直接就能systemctl start redis。但需要注意,系统仓库里的 Redis 版本可能滞后于官方版本,比如某些 CentOS 默认源里的 redis 还是 3.2。Redis 3.2 对于学习基本命令、测试简单缓存场景完全够用,但如果你要体验 Stream 类型、ACL 权限、多线程 IO 这些新特性,就必须要换源或者走源码编译。

另外,不同发行版包管理器启动 Redis 的姿势不完全一样:Ubuntu 上装完默认是被 systemd 接管了,所以直接systemctl enable redis-server设置开机自启;CentOS 上装完可能会提示你用redis-server /etc/redis.conf手动启动。我不会说包管理器这种方式不好,它其实非常省心,只是你要心里有数:你得到的 Redis 是什么版本,默认配置是否符合你的业务预期。

2.3 用 Docker 运行 Redis:容器化环境的标配

现在很多服务器本身就跑着 Docker,这时再用宿主机直接装 Redis 反而显得冗余。通过 Docker 安装 Redis 最大的优势是环境隔离,几乎不受宿主机系统版本和依赖库的影响,一条命令就能起一个实例:

docker run -d --name redis \ -p 6379:6379 \ -v /data/redis:/data \ -v /etc/redis/redis.conf:/etc/redis/redis.conf \ redis:7.2 redis-server /etc/redis/redis.conf

这里说一下参数的含义:-d表示后台运行,-p 6379:6379把宿主机的 6379 端口映射到容器的 6379,-v是把宿主机目录或文件挂载进容器。为什么要挂载数据目录?因为容器是临时的,一旦容器被删除,容器内部的数据就全部丢失,而 Redis 的 RDB 和 AOF 文件如果存放在宿主机/data/redis里,容器重建后数据还在。

用 Docker 跑 Redis 适合已经有微服务架构、习惯用容器管理服务的团队。但在单机小规模场景下,我反而觉得没必要多引入 Docker 这层依赖,直接源码编译更轻量,资源占用也更少。如果你需要做主从复制或者哨兵集群,那 Docker Compose 或者 Kubernetes 的编排能力就体现优势了,这个后面可以单独写一篇,不是本文的重点。

3. 配置文件里最值得细看的几个参数

装好 Redis 只是万里长征第一步,真正决定稳定性和安全性的,是配置文件redis.conf里的参数。很多人安装完直接默认启动,结果用一段时间就遇到内存暴涨、连接数打满、数据莫名丢失等问题。这一节我把最核心的几个配置项串讲一遍。

3.1 启动模式:daemonize 与 supervisord 的坑

Redis 默认配置里daemonize是no,也就是前台运行。如果你直接执行redis-server /path/to/redis.conf,会看到日志不停刷屏,终端也被占住。改成daemonize yes后,Redis 会以守护进程方式在后台运行,终端可以继续干别的。

这里有一个非常典型的坑:在 Docker 环境下,Redis 官方镜像里默认daemonize no,因为容器需要一个前台进程来维持容器生命。如果你把daemonize yes写进被挂载的配置文件里,容器可能会启动后立即退出,看起来像什么都没发生。所以判断要不要开 daemonize,先想清楚你是在裸金属/虚拟机环境部署,还是在容器里部署。宿主机部署用 daemonize yes 顺手,容器环境必须保持前台运行。

另外还有一个配套参数是pidfile,daemonize 开启后 Redis 会把进程号写入这个文件。如果配置了 pidfile,但对应目录不存在,Redis 同样会启动失败。所以前面规划目录时我就特意提醒过/var/run/redis这个目录要提前建好、给对权限。

3.2 bind、protected-mode 和 requirepass:安全三件套

Redis 默认配置里有几道安全关卡,默认情况下它们其实是帮你挡住外部扫描的,但很多教程为了图方便,会让人直接注释掉 bind 或把 protected-mode 改成 no,结果服务器就变成了公网“肉鸡”。我强烈建议你按下面的思路配置:

bind 0.0.0.0 protected-mode yes requirepass your-strong-password

bind 0.0.0.0表示监听所有网卡,适合需要被局域网内其他机器访问的场景。如果只用本机访问,可以只写bind 127.0.0.1。protected-mode yes的含义是:当 Redis 没有设置密码且没有显式 bind 时,只允许本机回环地址连接,避免未授权访问。一旦你设置了 bind 非本机地址,Redis 会认为你“有意暴露服务”,这时候如果没有密码,它是会拒绝外部连接的,这正是保护机制在起作用。

所以完整的逻辑是:要么bind 127.0.0.1只在本地用,要么requirepass设一个高强度的访问密码,把 protected-mode 保持开启。不要一上来就protected-mode no,那是把自己往火坑里推。设置密码后,客户端连接时需要redis-cli -a your-password或者在连接串里带上密码。

3.3 最大内存与淘汰策略

Redis 作为缓存,最怕的就是内存被写满。不设置maxmemory的话,Redis 会一直占用服务器内存直到触发 OOM,然后整个进程可能被系统杀掉。设置maxmemory的方式如下:

maxmemory 4gb maxmemory-policy allkeys-lru

maxmemory 4gb表示 Redis 最多使用 4GB 内存,超过之后就按照maxmemory-policy指定的策略淘汰 keys。常见的淘汰策略有这么几种:

策略含义适用场景
noeviction不淘汰,直接返回错误数据库不可丢数据,但容易触顶
allkeys-lru所有 key 按 LRU 近似算法淘汰最常见的缓存场景
volatile-lru只淘汰设置了过期时间的 key混合存储场景
allkeys-lfu按访问频率淘汰最不常用的 key热点数据特征明显的场景
volatile-ttl淘汰剩余 TTL 最短的 key想让快过期的 key 先走

我给你的建议是:如果是纯缓存,用allkeys-lru基本没错;如果缓存里混着一些不能丢的业务数据,可以改成volatile-lru并给这些重要 key 设置过期时间或者干脆不设过期。实际生产里我曾经见过把maxmemory设得比物理内存还高的情况,结果 swap 被疯狂使用,性能骤降,这个问题在后面常见问题里也值得记录一笔。

3.4 持久化:RDB 与 AOF 的取舍

Redis 虽然叫缓存,但很多场景里它承担着部分存储职责,这时候数据持久化就不能马虎。save相关参数控制 RDB 快照,默认配置大约是这样的:

save 900 1 save 300 10 save 60 10000

意思是:900 秒内有 1 次写操作就触发快照,300 秒内有 10 次写操作触发快照,60 秒内有 10000 次写操作触发快照。RDB 文件是二进制快照,恢复速度快,但如果 Redis 在两次快照之间崩溃,这部分数据会丢。

AOF 则是追加日志,默认关闭,需要自己开启:

appendonly yes appendfsync everysec

appendfsync有三个选项:always、everysec、no。always每条写命令都刷盘,最安全但性能最差;everysec每秒刷一次盘,性能和安全的平衡点;no让操作系统自己决定什么时候刷盘,性能最好但数据丢得最多。日常使用我推荐everysec。如果你对数据一致性要求极高,可以用always,但要做好吞吐量打折的心理准备。

4. 从启动到开机自启,把运维流程标准化

Redis 装好之后,接下来的问题是:怎么让它优雅地启动、优雅地停止、重启不丢配置,并且开机自动拉起。这些看似琐碎的步骤,恰恰是生产环境稳定运行的地基。

4.1 前台启动和后台启动到底怎么选

很多人分不清redis-server和redis-server /etc/redis.conf有什么区别。前者用的是内置默认配置,后者才是加载你的自定义配置文件。我遇到不少新手直接redis-server启动,结果改的 redis.conf 根本没生效,白忙活一场。

正确的启动方式是:

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

如果你没有把可执行文件放进 PATH,就得写全路径。配置文件路径错了,Redis 也会启动失败或者使用默认配置。启动之后,用redis-cli ping验证,返回PONG就说明服务已经起来了。如果配置了 requirepass,需要先redis-cli -a 密码 ping。

后台启动配置了daemonize yes之后,启动命令执行完会立即返回,Redis 进程在后台持续运行。这时候别急着走,最好看一眼日志文件,确认没有异常告警。日志路径在配置里是logfile "/var/log/redis/redis.log",默认可能是空字符串表示输出到标准输出,所以如果你的配置里没写 logfile,daemonize 模式下日志会丢失。

4.2 把 Redis 注册成 systemd 服务

systemd 是现代 Linux 发行版的标准服务管理器,所有主流发行版都支持。把 Redis 纳入 systemd 管理后,可以用systemctl start redis、systemctl enable redis这类统一命令操作服务,还能实现开机自启和故障自动拉起。

在/etc/systemd/system/redis.service里新建一个服务文件,参考内容如下:

[Unit] Description=Redis Server After=network.target [Service] Type=forking User=redis Group=redis ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/bin/kill -TERM $MAINPID PIDFile=/var/run/redis/redis.pid Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target

这里有几个关键点要说:Type=forking表示 Redis 启动后自己 fork 成守护进程,所以 systemd 会通过 PIDFile 来跟踪服务主进程,这个 PIDFile 必须和 redis.conf 里配置的 pidfile 保持一致。User=redis和Group=redis让 Redis 以低权限用户运行,这是安全基线要求。Restart=on-failure保证进程因异常退出时能自动拉起,但要注意,如果 Redis 是被密码错误或配置问题卡住反复退出,这个自动重启会变成一种“抖动”,日志里会有大量重启记录,排查时结合journalctl -u redis看。

文件写好后执行:

systemctl daemon-reload systemctl enable redis systemctl start redis systemctl status redis

daemon-reload必须执行,否则 systemd 不会识别新建的服务文件。status命令会显示当前服务状态、主进程号、最近的日志,这是排查问题的第一入口。

4.3 日常运维:重启、重载和优雅关闭

Redis 支持两种常见信号:SIGTERM正常关闭,SIGKILL强制终止,后者可能导致数据丢失。通过 systemd 操作时,systemctl stop redis会发 SIGTERM,Redis 会把内存中的数据执行保存后退出,这是优雅关闭的标准姿势。

如果修改了 redis.conf,很多参数可以通过systemctl reload redis触发ExecReload里配置的kill -USR2 $MAINPID来生效。但要注意并不是所有配置都支持热加载,比如maxmemory、appendonly这些可以在运维时通过redis-cli config set在线修改,而这些修改默认是临时的,重启后失效;要让修改永久生效,还得在 redis.conf 里同步改,或者用CONFIG REWRITE命令把运行时配置写回配置文件。

日常巡检时我的习惯是执行三条命令:

redis-cli info server | grep redis_version redis-cli info memory | grep used_memory_human redis-cli info stats | grep instantaneous_ops_per_sec

一条查版本,一条看内存占用,一条看当前 QPS。这三项能覆盖绝大多数健康度判断场景。

5. 连接验证与客户端选型:装完不能只会 redis-cli

安装部署完成只是开始,接下来你需要验证服务是否真的可用,并且选择适合团队使用的客户端工具。这里既有命令行工具,也有可视化客户端,按使用场景不同分开说。

5.1 用 redis-cli 做功能验证

redis-cli是官方自带的命令行客户端,也是排查问题的第一把钥匙。最基本的连接命令:

redis-cli -h 192.168.1.10 -p 6379 -a your-password

进入交互模式后,执行ping返回PONG,set foo bar能写入,get foo能读取,说明服务端一切正常。redis-cli还支持很多排查类命令,比如redis-cli info查看运行时信息,redis-cli monitor实时打印所有请求,redis-cli --bigkeys扫描大 Key。尤其--bigkeys在生产环境里非常有用,可以快速找出内存占用异常的大键,这类键往往会导致慢查询和内存倾斜。

还有一个小技巧:redis-cli -a在命令行里直接带密码会出现在 shell 历史里,有安全隐患。更稳妥的做法是设置环境变量REDISCLI_AUTH:

export REDISCLI_AUTH='your-password' redis-cli ping

这样 redis-cli 会自动读取环境变量里的密码,避免密码出现在命令行参数和 history 里。这一点很多老运维也会忽略。

5.2 可视化客户端:Another Redis Desktop Manager 值得一试

命令行适合排查问题,但要快速浏览数据、批量修改 key,可视化客户端效率更高。市面上常见的几款工具我简单列一下:

  • Redis Desktop Manager:老牌工具,交互成熟,但部分版本收费
  • Another Redis Desktop Manager:开源免费,跨平台,功能完善
  • Redis Insight:Redis 官方推出的桌面工具,界面新,内置分析能力
  • 命令行爱好者也可以用 redis-cli 加上--json之类参数做辅助

我个人比较推荐 Another Redis Desktop Manager,因为它在 Linux 和 Windows 上都有现成客户端,连接远程 Redis 时只需要填 IP、端口、密码,还能按正则表达式匹配 key。不过要注意,生产环境使用可视化工具时,尽量只开只读权限的账号,避免误操作把数据清掉。正因如此,Redis 6.0 之后引入的 ACL 权限体系值得认真用起来,给不同角色分配最小权限。

5.3 局域网多实例部署时要注意什么

如果你的服务器需要被多台业务机器连接,一定要确认几个点:第一,防火墙放行对应端口,比如firewall-cmd --add-port=6379/tcp --permanent或者安全组规则里加白名单;第二,确认bind没有只停留在127.0.0.1;第三,确认客户端连接串里有正确的密码。多实例部署时,建议每个实例用独立端口、独立配置目录、独立持久化目录,比如 6380、6381 分别对应不同的业务线,这样可以避免相互影响。

我曾经接手过一台服务器,上面跑着三个 Redis 实例,由于配置目录没有分开,一个实例执行了FLUSHALL,其他实例的数据也一起被清掉了。这个教训说明,多实例环境下不仅要隔离文件目录,更要隔离权限账号,操作时看清当前连接的是哪个端口。

6. 常见问题与排查思路:这些坑我替你先踩了

最后这部分是我最想分享的内容。安装 Redis 过程中,绝大多数报错都不是玄学,而是有明确原因的。下面整理几个高频问题,每个问题附带排查步骤和解决思路。

6.1 编译报错:jemalloc/jemalloc.h: No such file or directory

这个报错可以说是源码安装时出现频率最高的。Redis 默认的构建方式会使用deps/jemalloc,如果系统缺少必要的构建工具链,或者某些系统路径下的头文件缺失,就会导致编译中断。解决办法有三种:

第一种,在 make 时强制使用 libc 内存分配器:

make MALLOC=libc

第二种,先清理编译缓存再重试:

make distclean make

第三种,安装构建依赖后重新编译:

# Ubuntu/Debian apt install build-essential tcl pkg-config -y # CentOS/RHEL yum groupinstall "Development Tools" -y

一般做完这三步,编译问题就迎刃而解了。如果还不行,把错误信息完整贴到搜索引擎里,基本都能找到对应发行版的解决方案。

6.2 启动后看不到进程,日志也没报错

这种情况往往让人最头疼。执行redis-server redis.conf后命令没有输出,但ps -ef | grep redis也看不到进程,服务似乎“凭空消失”了。

第一步先确认配置文件里的daemonize是不是 yes,如果是,Redis 会 fork 到后台,命令本身没有输出是很正常的。第二步检查 pidfile 路径,如果配置了/var/run/redis/redis.pid,而/var/run/redis目录不存在,进程会启动失败。第三步看日志文件,如果配置了logfile,去对应路径查看;如果没配置,Redis 默认向 stdout 输出,daemonize 后这些输出往往就丢了。所以我的建议是:配置阶段一定要把 logfile 配好,排查问题时日志就是最可靠的现场。

6.3 客户端连接超时,问题多半出在防火墙

Redis 装上去了,本机 redis-cli 能连,但远程一连接就超时。遇到这种问题,先别怀疑 Redis 配置,按顺序检查三个地方:

第一,bind是否只绑了回环地址。执行redis-cli -h 127.0.0.1 info能连但redis-cli -h 服务器IP info连不上,多半就是 bind 问题。第二,防火墙是否放行端口。CentOS 7 以上默认用 firewalld,执行firewall-cmd --list-all查看开放端口。第三,云厂商安全组规则。很多云服务器即使系统防火墙放行了,安全组层面仍会拦截,需要在控制台配置入方向规则。

我之前处理过一个案例,排查到最后发现是云平台安全组只放行了 22 端口,Redis 的 6379 虽然在系统防火墙里放行了,但到云平台那一层就被拒了。这类问题只要按“本机-防火墙-安全组”的顺序逐层排查,几分钟就能定位。

6.4 maxmemory 设置过高导致 swap 抖动

这也是一个很隐蔽的性能问题。服务器物理内存 8GB,Redis 的 maxmemory 也设成 8GB,结果 Redis 进程占用的内存加上系统其他程序的内存,一共超过了物理内存,操作系统开始把 Redis 的内存页换到 swap。Redis 一旦发生 swap,访问延迟会从微秒级飙升到几十毫秒甚至更高。

排查方法很简单:执行redis-cli info memory查看used_memory,同时用free -h看 swap 使用情况。如果 swap 明显增长,说明内存分配过大了。正确的做法是给 Redis 预留足够的内存余量,比如物理内存 8GB 的机器,maxmemory 设置 4GB 到 5GB 已经算比较激进了,剩下要留给操作系统页缓存和其他进程。还有一种更细的做法是启用内核参数vm.swappiness=1,尽量减少 swap 的使用倾向。

6.5 Redis 频繁重启,先看日志再看内核参数

生产环境最怕 Redis 无缘无故退出。这类问题我会先看journalctl -u redis,如果发现有Background saving error或者Can't save in background: fork: Cannot allocate memory,那基本可以判断是 overcommit 策略设置导致的。Linux 默认的vm.overcommit_memory=0,Redis 做 RDB 持久化时 fork 子进程会尝试申请一块接近父进程内存大小的虚拟内存,如果系统认为自己内存不足,fork 就会失败。

解决方式是设置:

sysctl vm.overcommit_memory=1

这个值的意思是允许进程申请超过物理内存的虚拟内存,Redis 的 fork 就不会因为虚拟内存不足而失败。同时,还可以开启 Transparent Huge Pages 禁用,因为 THP 会增大 Redis 的延迟和内存消耗,可以通过如下方式临时关闭:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

持久化设置可以写到/etc/sysctl.conf和相关的 rc.local 或 systemd unit 里。这类内核参数是很多安装教程不会提的,但生产环境一旦遇到 Redis 无故崩溃,它们往往就是幕后黑手。

写在最后的一点个人经验

这篇文章里的每一步,几乎都是我在真实服务器上跑过的。从最早只会yum install redis然后被老版本坑,到后来坚持源码编译、规范目录、设置 systemd,再到把安全参数和内核参数调到位,这个进化过程其实就是运维经验的积累过程。如果你要问我最重要的建议是什么,我会说:安装 Redis 不难,难的是安装之后那一整套配置和运维习惯。把 daemonize 和 pidfile 的关系搞清楚,把 bind 和 protected-mode 的关系搞清楚,再养成看一眼日志的习惯,你就能避开大部分新手会踩的坑。另外,装完之后记得做一次重启演练——先把 Redis 停掉,再启动,确认数据还在、配置没丢、服务能正常拉起。这个动作看着简单,但真到服务器宕机恢复的时候,能帮你省下最宝贵的抢救时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 11:46:50

OpenClaw接入硅基流动API:Ubuntu服务器部署AI代理全攻略

最近折腾个人AI助手,把OpenClaw接到了硅基流动API上,整体跑通了,顺手记录一下部署和集成的全过程。如果你也准备在Ubuntu服务器上搞一套自己的AI代理,或者正在纠结怎么把大模型API接进现有工具链,这篇内容应该能帮你省…

作者头像 李华
网站建设 2026/9/30 11:46:21

ES搜索实战:从倒排索引原理到Spring Boot集成与性能优化

对于刚接触Elasticsearch(以下简称ES)的人来说,最容易产生的困惑就是:明明照着文档把查询语句写出来了,结果却不尽如人意——要么搜不到想要的文档,要么搜出来一堆不相关的结果。我见过不少项目组把ES当关系…

作者头像 李华
网站建设 2026/9/30 11:45:58

呼叫中心自建全流程拆解:从租赁决策到双机热备避坑指南

简介:一份呼叫中心建设计划书,面向计划从云租赁模式转向自建模式的企业信息化、客服系统规划人员,也适合呼叫中心项目管理与运维团队参考。文档以公司旧有云租赁呼叫中心成本高、客户信息存于第三方机房等痛点为切入点,梳理了采用…

作者头像 李华
网站建设 2026/9/30 11:40:46

iperf网络性能测试实战:从带宽测量到链路质量排查

说实话,网络问题排查是我日常工作中最讨厌的环节之一。上一秒还正常的服务,下一秒用户就反馈“页面打不开”,可你敲 ping 一切正常,看 CPU、内存也没毛病,最后折腾半天才发现问题出在链路质量上。这种时候,…

作者头像 李华
网站建设 2026/9/30 11:39:34

SpringBoot+Vue全栈实战:扶贫惠农推介系统从设计到部署

从接到这个题目开始,很多人的第一反应就是"又是一个典型的增删改查毕业设计"——确实,基于SpringBoot和Vue做管理系统已经是Java方向最经典的组合拳了。但真正动手做"扶贫惠农推介系统"的时候你会发现,它跟普通的商品管理…

作者头像 李华