
很多新手第一次在Linux上装Redis习惯性去搜教程然后复制粘贴几行命令结果要么是make的时候报错要么是装好了没几天重启服务器服务直接找不到了。我早年在生产环境第一次部署Redis时也栽过跟头CentOS 6自带的gcc版本太老编译Redis 4的时候直接报错折腾了一上午才搞定依赖问题。这篇文章我就把整个安装流程从头讲透从下载、编译、配置到启动、排错每一步都告诉你为什么要这么做而不是简单丢几行命令就结束。适合刚接触Linux的读者也适合已经会“安装三步走”但想弄明白背后原理的同学。1. 安装前的环境确认与下载源选择很多人安装Redis失败不是命令敲错了而是压根没确认自己的Linux环境。Redis是一个C语言编写的程序安装过程本质上就是“下载源码→本机编译→部署”所以环境里缺了编译器、make工具、tcl等依赖后面一定会报错。开始之前先用几分钟做三件事。1.1 确认Linux发行版、内核和架构不同发行版的包管理器和依赖安装方式完全不同先确认自己用的是哪套系统cat /etc/os-release uname -m free -h df -h第一行看发行版第二行看CPU架构第三行看内存第四行看磁盘空间。Red Hat/CentOS系用yumUbuntu/Debian系用aptopenEuler/Anolis用dnf或yum命令不能混用。架构方面x86_64是最常见的如果你用的是ARM服务器鲲鹏、飞腾等编译参数上通常没有特殊区别但下载预编译包时要注意选对架构。内存低于1GB的小机器编译Redis会慢得让人怀疑人生建议至少预留512MB可用内存和1GB磁盘空间给编译过程。1.2 Redis版本为什么不能随便选Redis官网目前主推7.x系列新特性多性能也有提升但版本不是越新越好而是要看你的系统环境和业务需求。最核心的坑在于编译器的版本。Redis 6.0以上在编译时对gcc版本有明确要求官方文档写的是gcc需要5.3以上实际体验下来gcc 5.x编译Redis 7.0以上版本经常会冒出各种奇奇怪怪的报错。CentOS 7系统默认的gcc是4.8.5直接编译Redis 7几乎必挂。遇到这种情况要么给系统升级gcc用Software Collections或者手动编译新版gcc都比较折腾要么老老实实装Redis 5.0.x这种对老系统友好的版本。我的建议很简单CentOS 7用户优先选Redis 5.0.x或6.0.xUbuntu 20.04/22.04、CentOS 8/Stream 9这类系统默认gcc都够新直接上最新的7.x稳定版没问题。版本选择上别追求“最新”稳定、能编译、和你的业务代码兼容这三条才是关键。1.3 下载压缩包的三种可靠方式Redis官方下载地址是download.redis.io/releases/页面里会列出所有版本的源码包。但在国内直接访问这个域名经常慢到怀疑人生我一般用下面三种方式官网下载到本地再用scp或宝塔面板等工具传到服务器上适合没有外网下载环境的内网机器直接服务器上用wget下载命令是wget https://download.redis.io/releases/redis-7.2.4.tar.gz如果速度太慢就换镜像站国内镜像站下载华为云、清华TUNA、阿里云都有Redis源码包的镜像把URL前缀换掉就行速度快很多。我习惯把源码包统一放到/usr/local/src目录下所有自己编译安装的软件都放这里方便管理也方便以后卸载清理。2. 解压编译安装全流程环境确认没问题版本也选好了就可以进入实操阶段。整个编译安装过程大概十分钟左右取决于机器性能。下面我用Redis 7.2.4在CentOS 7.9上的安装过程来做演示如果你用Ubuntu或更高版本的系统步骤基本一致只有安装依赖那一步的命令不同。2.1 安装编译依赖的坑与解法在CentOS上需要先安装编译工具链yum install -y gcc make wgetUbuntu/Debian系统则是apt-get update apt-get install -y build-essential wget tcl这里有个很容易被忽略的细节build-essential这个包在Ubuntu里包含了gcc、make等全套编译工具但在CentOS里并没有这个包名名称叫gcc和make。不少教程写的是Ubuntu的命令你在CentOS照抄就会提示“No package build-essential available”白白浪费时间排查。如果你用的是CentOS 7且想编译Redis 6.0以上装完gcc后记得确认一下版本gcc --version如果还是4.8.5也别慌有两个选择一是安装Software Collections里的高版本gcc命令是yum install -y centos-release-scl yum install -y devtoolset-8-gcc然后通过scl enable devtoolset-8 bash临时切换环境二是干脆换Redis 5.0.x。我不建议新手在生产环境折腾gcc升级编译工具链变了可能影响系统里其他软件的运行为了装一个Redis去动gcc性价比不高。2.2 编译参数背后的门道依赖装好之后解压源码包进入目录开始编译cd /usr/local/src tar -zxvf redis-7.2.4.tar.gz cd redis-7.2.4 make -j$(nproc)-j$(nproc)的意思是让make用CPU的全部核心并行编译四核机器会比单核快很多。这一步会编译出src目录下的可执行文件但还没安装到系统目录。很多教程到这里就直接用src/redis-server启动了我不建议这样干源码目录一旦被清理服务就起不来了。正确的做法是执行安装命令指定安装路径make PREFIX/usr/local/redis install这条命令会把可执行文件安装到/usr/local/redis/bin目录下把二进制文件和源码分开目录结构更清晰。安装完成后bin目录下会出现这些文件文件作用redis-serverRedis服务端主程序redis-cli命令行客户端用于连接和操作Redisredis-sentinel哨兵模式启动程序用于高可用部署redis-benchmark性能测试工具redis-check-aof / redis-check-rdb持久化文件检查修复工具看到这几个文件编译安装就算成功了。先别急着高兴还有一步很多人会纠结要不要跑make test。这一步会花几分钟到十几分钟不等用来验证编译出来的Redis是否正常。跑了当然更稳妥但需要安装tclCentOS执行yum install -y tclUbuntu已经装过不跑也不影响使用只是出问题时少了一个排查手段。我的习惯是第一次装跑一遍后续升级版本就省略了。2.3 编译过程中的报错清单这个环节是新手最容易劝退的地方我把几个高频错误和解决办法列出来你对照着处理就行cc: command not found——系统没装gcc回到2.1安装编译工具链。malloc.h: No such file or directory或jemalloc相关报错——Redis默认使用jemalloc内存分配器但它在某些系统环境下编译不过这时候可以用Redis自带的libc内存分配器编译make MALLOClibc -j$(nproc)zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory——同样是jemalloc没编译成功先执行make distclean清掉之前的编译缓存再重新编译。各种关于clang、gcc版本过旧的报错——多得数不清核心原因就是你选的Redis版本和系统编译器不匹配降低Redis版本、升级gcc二选一。遇到编译错误别急着到处搜先看报错的头几行它一般会直接告诉你缺什么文件或什么版本不够对症下药比盲目重装有效得多。3. redis.conf配置文件的关键参数编译这关过了Redis才完成了一半。真正的重头戏在配置文件因为Redis默认配置是“开箱即不安全、开箱即不适用于生产”的。不调整就直接启动你会发现只能本机访问外部连不上没有密码验证日志也不知道输出到哪。下面我把配置文件里必须理解的参数拆开讲一遍。3.1 Redis默认配置文件在哪里、怎么选源码目录下有一个redis.conf模板文件。编译安装不会自动帮你创建配置文件目录需要手动复制一份出来mkdir -p /usr/local/redis/conf cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/redis/conf/redis.conf把配置文件和二进制文件分开存放后续升级Redis版本时直接替换bin目录配置文件不动数据也不受影响。如果你用/usr/local/redis作为安装根目录建议把所有运行文件都放在这个父目录下面一个软件一个目录清清爽爽。3.2 必调参数与含义打开配置文件vim /usr/local/redis/conf/redis.conf里面有几百行注释看起来很吓人但绝大多数保持默认就行。你需要重点关注和修改的参数如下参数默认值建议值说明daemonizenoyes是否以守护进程方式后台运行。改成yes后启动命令执行完就会返回Redis在后台自己跑port63796379默认端口没特殊要求不用改bind127.0.0.1 -::10.0.0.0 或具体内网IP默认只允许本机连接。想让其他机器访问改成0.0.0.0代表监听所有网卡或者写死成服务器的内网IP更安全protected-modeyesyes配合密码保护模式。如果bind设置了非本机地址且没设置密码这个参数会强制拒绝外部连接requirepass无你自己的强密码客户端连接时需要密码验证。生产环境必须设置dir.//var/lib/redisRDB和AOF持久化文件存放的目录。默认是启动Redis时所在的工作目录非常坑一定要指定固定路径logfile空/var/log/redis/redis.log日志文件路径。不设置且daemonize为yes时日志直接扔进/dev/null出问题根本查不到appendonlyno按需调整是否开启AOF持久化。默认用RDB快照数据安全性要求高的业务建议开AOFmaxmemory无根据机器内存设置限制Redis最大可用内存超出后有maxmemory-policy指定淘汰策略不设置等于把机器内存用光maxmemory-policynoevictionallkeys-lru或noeviction内存淘汰策略生产环境按业务场景选择光把表格看明白还不够我挑两个关键点展开说。bind和protected-mode这对组合是所有外部连接失败的头号原因。默认情况下bind是127.0.0.1Redis只监听本机回环地址你从别的机器用redis-cli连进来包根本到不了Redis进程。改bind成0.0.0.0后如果protected-mode还是yes且你没设requirepassRedis会直接拒绝带密码验证的连接提示“DENIED Redis is running in protected mode”。所以正确姿势是bind和requirepass配合调整设了强密码再开放监听地址。dir参数是坑王。我见过太多人Redis跑得好好的一重启数据全没了排查到最后发现是dir指向了临时目录系统一清理文件夹就没了。RDB持久化文件dump.rdb默认生成在dir指定的目录建议先创建好目录再在配置文件里指定mkdir -p /var/lib/redis chown redis:redis /var/lib/redischown那一步在系统用户运行Redis时才需要如果你是用root启动的可以忽略。但生产环境我强烈建议用独立用户跑Redis这是安全基线要求不是可选项。3.3 配置文件的生效机制修改完配置不是自动生效的必须重启Redis进程或者用redis-cli config rewrite把运行时的配置写回文件。新手最容易犯的错是改了配置文件没重启然后跑来问“为什么我改了密码还连不上”。还有一个细节虽然Redis支持CONFIG SET命令动态修改部分参数比如CONFIG SET requirepass xxx不需要重启进程但动态修改只对当前运行实例生效不会持久化。想要重启后依然生效必须同时执行CONFIG REWRITE把当前配置写回redis.conf或者改动后直接重启服务。4. 启动、验证与systemd托管配置改好进入启动环节。很多人上来就直接systemctl start redis结果发现系统里根本没有这个服务。因为Redis是从源码编译安装的不像yum安装那样会自动注册成系统服务必须手动创建service文件。4.1 先前台启动验证配置第一次启动建议用前台模式这样能直接看到输出方便排错/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf如果配置文件里有语法错误前台启动会直接打印错误信息。看到类似Ready to accept connections的日志就说明启动成功。新开一个终端窗口验证一下进程和端口ps -ef | grep redis ss -lntp | grep 6379ss命令看到127.0.0.1:6379或者0.0.0.0:6379在监听就说明服务正常。确认没问题后CtrlC停掉前台进程改用后台守护进程方式启动。把配置文件里的daemonize改成yes然后再次执行/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf这次命令执行完会立即返回Redis在后台运行。用ps -ef | grep redis确认进程状态。4.2 用redis-cli做安装成功验证Redis自带命令行客户端这是日常使用最频繁的工具。连接本地Redis执行ping如果返回PONG说明服务端和客户端都正常/usr/local/redis/bin/redis-cli ping如果你设置了requirepass密码需要在命令里带密码/usr/local/redis/bin/redis-cli -a 你的密码 ping顺便验证数据读写是否正常/usr/local/redis/bin/redis-cli -a 你的密码 set testkey helloworld /usr/local/redis/bin/redis-cli -a 你的密码 get testkey能正常写入和读取Redis的核心功能就没问题了。测试完记得把测试key删掉。为了让redis-cli和其他命令在任何目录下都能直接敲把bin目录加入系统PATHecho export PATH/usr/local/redis/bin:$PATH /etc/profile.d/redis.sh source /etc/profile.d/redis.sh之后直接用redis-cli、redis-server、redis-benchmark不用再带全路径。4.3 systemd托管服务源码编译的Redis没有注册成系统服务服务器一重启Redis不会自动拉起来。手动去启动又很容易忘记。解法是写一个systemd服务单元文件vim /usr/lib/systemd/system/redis.service内容如下[Unit] DescriptionRedis Server Afternetwork.target [Service] Typeforking ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecStop/usr/local/redis/bin/redis-cli -a 你的密码 shutdown Restarton-failure Userroot [Install] WantedBymulti-user.target几个关键点说明一下Typeforking因为配置文件里daemonize是yesRedis启动时父进程会fork出子进程然后退出systemd需要知道这个行为模式才能正确跟踪服务状态ExecStop用redis-cli发送shutdown命令优雅关闭避免直接kill导致持久化数据没来得及写盘Restarton-failure服务异常退出时自动拉起这个参数我强烈建议设置很多内存问题导致的Redis闪崩靠它能在几秒内恢复User建议不要用root创建一个专门的redis系统用户更安全。但新手阶段先用root跑通后续再加固。写完文件后重载systemd并启动服务systemctl daemon-reload systemctl enable redis systemctl start redis systemctl status redisenable命令是设置开机自启看到active (running)状态整个安装流程就大功告成了。5. 安装过程中的常见报错与排查思路把整个安装过程中我遇到过的、以及帮别人排查过的高频报错汇总一下按阶段拆开讲。排查问题的核心思路是先看日志、再看状态、最后才动配置。5.1 编译阶段的报错与排查编译阶段最常见的报错是缺依赖和编译器版本不兼容前面已经重点讲过。这里补充一个很隐蔽的坑在之前编译失败后直接重新make有时候会残留一堆旧的.o目标文件导致新报错莫名奇妙地冒出来。遇到这种情况先执行一次make distclean把编译缓存全部清掉再重新make90%的“玄学报错”都能解决。还有一个容易被忽略的问题是磁盘空间。编译高峰期会生成大量临时文件df -h看一下根分区使用率如果超过90%编译大概率会失败报错信息通常是No space left on device。清理磁盘后再试。5.2 启动阶段的报错与排查启动报错和配置强相关最常见的就是日志路径或持久化目录没有创建# Cant open the log file: Permission denied # Cant chdir to /var/lib/redis: No such file or directory这种问题解决办法很简单先把日志目录和持久化目录创建好目录权限和启动用户对上。配置文件里写/var/log/redis/redis.log但系统里根本没有/var/log/redis目录Redis启动时当然会报错。改配置时凡是涉及绝对路径的确保目录真实存在、权限正确。如果启动后进程很快就退出了优先看日志文件没设logfile的话去/var/log/messagesCentOS或/var/log/syslogUbuntu里找线索。日志的提示通常比你猜得更准。5.3 客户端连接阶段的报错与排查这一阶段的报错最磨人因为服务端明明跑着外部就是连不进来。我把常见错误和对应解法整理成一张表报错信息含义排查方向Connection refused连接被拒绝先查进程是否存活再查端口是否监听最后看防火墙和SELinuxDENIED Redis is running in protected mode保护模式拦截设置密码或调整bind参数关闭protected-mode不是首选方案NOAUTH Authentication required未通过认证客户端连接时用-a 密码参数WRONGPASS invalid username-password pair密码错误检查requirepass配置和客户端密码是否一致Redis is configured to save RDB snapshots...RDB持久化失败磁盘空间满了或者dir目录没有写权限及时处理防火墙是最容易被忽略的一环多的是装了Redis却连不上最后发现是firewalld或iptables在作怪。CentOS 7默认用的是firewalld检查并放行6379端口的方法firewall-cmd --zonepublic --add-port6379/tcp --permanent firewall-cmd --reload firewall-cmd --list-portsUbuntu用的是ufwufw allow 6379/tcp ufw status还有一尊大佛是SELinux。CentOS上默认开启的SELinux会把Redis的网络访问权限限制得很死即使防火墙放行了外部依然连不上。快速验证方法是执行getenforce如果返回Enforcing要么临时执行setenforce 0放开要么给Redis写对应的SELinux策略模块。长期来说我建议用后者或者干脆把SELinux调到Permissive模式新手直接在SELinux上跟它硬刚很容易劝退。生产环境安装Redis从来不是“跑起来就完事”装完之后我习惯做三件事一是用redis-cli info看一眼内存、连接数、命中率这些核心指标二是用redis-benchmark跑一把基础性能测试心里有底三是把/var/log/redis和/var/lib/redis目录纳入日志轮转和定期备份计划。这样后续就算出现性能瓶颈或数据问题排查时也有据可依。最后分享一个小习惯每次改完配置文件我都会先redis-cli config get save确认改动生效再用redis-cli config rewrite把运行时配置落盘双保险既不怕配置文件改错也不怕重启后配置丢失。