
在Linux上安装Redis最迷惑人的地方往往不是步骤本身而是你五分钟跑起来之后后面几天陆陆续续暴露出来的问题。yum install redis或者apt install redis-server确实快但当你需要固定版本、自定义存储目录、把日志和数据分开放的时候包管理器给的默认布局就会开始添乱。我见过不少同学在/tmp目录下启动redis-server然后清理临时文件时把RDB快照一起删掉这种坑听着低级其实非常容易踩——因为默认配置里数据文件就落在你启动命令的那个目录。这篇内容不准备讲什么高深理论就是想把Linux安装Redis这条路上该做的决定、该写的配置、该避开的坑完整过一遍。环境按最常见的CentOS 7系和Ubuntu 20.04/22.04 LTS系来写命令两边都给。内容适合第一次在服务器上部署Redis的新手也适合一直用包管理器安装、想换成源码编译并纳入systemd管理的同学参考。1. 动工之前先决定这几种装法怎么选1.1 用包管理器装解放双手但有哪些代价包管理器是大部分人的第一反应因为实在方便。CentOS/RHEL系执行yum install -y redisUbuntu/Debian系执行apt update apt install -y redis-server装完直接就能用systemctl start redis redis-cli ping这套流程没什么技术含量但也正因为没得选你会把很多安装决策交给别人。仓库里的Redis版本往往比官方稳定版落后一两个大版本比如官方已经7.2了仓库还在6.2甚至5.x。另外配置文件被丢到/etc/redis.conf二进制散落在/usr/bin、/usr/sbin数据默认写进/var/lib/redis日志看心情出现在/var/log/redis。对于一个要长期维护的服务来说这种散装布局排查问题非常别扭。我整理了一个对比方便你直观判断对比项包管理器安装源码编译安装版本可选性跟随仓库通常滞后完全自主选择目录布局分散在系统多个目录统一在指定前缀下编译参数不可控可控如内存分配器升级方式等仓库更新重新编译替换即可安装耗时秒级数分钟我的结论是本机写Demo、快速验证语法包管理器完全够用服务器上要长期跑、后面还可能做多实例或主从建议直接上源码编译。1.2 源码编译的核心收益目录可控、版本可选源码编译并没有想象中那么可怕核心就是下载官方源码包用系统自带的GCC把它编译成可执行文件然后放到一个你自己指定的目录里。这样做的好处有三个。第一是目录可控。所有Redis相关文件都在一个前缀目录下比如/usr/local/redis里面bin放二进制、etc放配置、data放数据、log放日志。以后要备份、迁移、卸载直接把整个目录带走或删掉干净利落。第二是版本可控。你可以在官方下载页挑任意一个稳定版不受系统仓库更新节奏影响。生产环境需要固定版本时这个优势特别明显不会因为某天仓库悄悄升级了Redis导致行为和之前不一致。第三是编译参数可控。少数场景下需要调整内存分配器源码编译可以做到包管理器完全给不了这个自由度。当然我也要说句公道话源码编译不是银弹它要求系统里有完整的C编译工具链编译本身也要等几分钟。但如果你手头是一台即将承载业务的服务器这几分钟换来的可控性非常值。1.3 装之前先检查系统和目录规划动工之前先把编译工具链确认一遍。分别执行gcc -v make -v如果提示找不到命令CentOS系安装yum install -y gcc makeUbuntu系安装apt update apt install -y build-essential这里有两个小知识。Redis本身是C语言写的所以GCC和GNU Make是硬依赖jemalloc这个高性能内存分配器已经内置在Redis源码的deps目录里不需要你额外装。TCL库则是跑官方测试脚本时才需要的依赖如果你不打算执行make test可以跳过。版本选型上建议选当前稳定主线的最高稳定版比如7.2.x6.2.x属于维护分支。RC版不要在生产环境碰。目录规划是很多人忽略的一步我建议提前建好四个目录/usr/local/redis/bin存放可执行文件/usr/local/redis/etc存放redis.conf/usr/local/redis/data存放RDB和AOF文件/usr/local/redis/log存放运行日志这里有个反直觉的坑Redis默认的dir参数指向启动时的当前工作目录。如果你在/tmp目录下执行redis-serverRDB快照就直接落在/tmp里。很多新手找半天找不到数据文件原因就在这里。所以目录规划不是洁癖是保命。2. 源码编译安装下载、编译到目录归位2.1 下载源码包顺带做一次校验官方源码包统一在download.redis.io/releases/目录下。以7.2.x为例cd /opt wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar zxvf redis-7.2.4.tar.gz cd redis-7.2.4如果服务器访问国外源比较慢可以找国内镜像但有一点必须注意不要随便下第三方改过的包。官方页面提供了SHA256校验和下载后顺手验一下sha256sum redis-7.2.4.tar.gz拿输出和官方给出的checksum对比一致再继续。这一步很多人嫌麻烦跳过但养成校验习惯对运维来说比什么都重要。2.2 make与make install的正确姿势进入解压出来的源码目录后直接编译make -j$(nproc)-j参数是并行编译$(nproc)会自动探测CPU核心数。比如8核机器就是-j8能让编译速度肉眼可见地提升。首次编译大概几分钟取决于机器性能。编译过程如果报错最常见的是jemalloc相关错误通常发生在GCC版本较老或系统资源受限的机器上。应急做法是make clean make MALLOClibc -j$(nproc)MALLOClibc的意思是让Redis放弃内置的jemalloc改用系统默认内存分配器。功能和稳定性没有本质区别只是高并发场景下的内存分配性能略逊一筹作为临时绕过手段可以正式环境还是建议先把GCC升级到合理版本再用默认的jemalloc重新编。编译成功后再安装指定前缀目录make install PREFIX/usr/local/redis这一步会把编译好的二进制安装到/usr/local/redis/bin下。安装完检查一下ls -l /usr/local/redis/bin你会看到6个文件redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-rdb、redis-sentinel。其中redis-check-aof和redis-check-rdb是数据文件修复工具很多教程提都不提等你某天RDB文件损坏时会发现它们特别有用。2.3 目录整理、PATH设置和版本确认二进制安装好后把配置和数据目录一并建好mkdir -p /usr/local/redis/{etc,data,log} cp redis.conf /usr/local/redis/etc/源码目录里的redis.conf就是默认配置文件拷贝到etc目录下作为以后真正使用的配置。接下来设置PATH方便手动敲命令echo export PATH/usr/local/redis/bin:$PATH /etc/profile.d/redis.sh source /etc/profile.d/redis.sh这里用/etc/profile.d下的脚本文件而不是直接在命令行export是为了让所有新登录的会话都能自动加载。但要注意后续写systemd服务文件时我仍然会使用二进制的完整路径不依赖PATH。这样即使机器上有多个Redis版本服务文件指向也足够明确不会互相干扰。最后确认安装结果redis-server -v能看到类似Redis server v7.2.4的输出说明编译安装这关过了。3. 配置文件从默认值改到能上线这些项必须动3.1 bind、protected-mode、daemonize之间的关系打开刚拷贝过来的配置文件vim /usr/local/redis/etc/redis.conf默认配置能跑但直接上生产等于裸奔。我先说三个必须弄明白的参数它们是Redis本地安全模型的基础。bind决定Redis监听哪些网卡地址。默认127.0.0.1 -::1意味着只接受本机连接。如果Redis要提供给其他服务器访问需要改成内网IP比如bind 192.168.1.10而不是无脑改成0.0.0.0。0.0.0.0意味着所有网卡都监听等于把服务暴露给所有能路由到这台机器的人除非你有充分的安全防护否则别这么干。protected-mode是Redis的保护性开关。默认yes时如果Redis没有设置密码并且监听地址包含非本机网卡它会拒绝远程连接。这个机制能拦住很多裸奔事故建议保持yes。daemonize决定Redis是否自己后台化。默认是no保持前台运行。很多人习惯改成yes觉得这样省事但在systemd环境下这恰恰是错误做法。后面我会单独讲为什么no更稳。这一段推荐的最小组合是bind 127.0.0.1 protected-mode yes port 6379 daemonize no supervised systemd pidfile /run/redis/redis_6379.pid loglevel notice logfile /usr/local/redis/log/redis.log dir /usr/local/redis/datasupervised systemd这一行是给systemd托管用的pidfile放到/run/redis目录下这个目录后面由systemd自动创建。dir指向数据目录这一步就把我在1.3节说的RDB乱写目录问题从根上解决了。3.2 持久化策略和内存上限别指望默认值Redis默认开了RDB快照配置大概是save 3600 1 save 300 100 save 60 10000这三行的意思不是同时满足而是三档渐进条件3600秒1小时内至少有1次写操作、300秒5分钟内至少有100次写操作、60秒1分钟内至少有10000次写操作满足任意一档就会触发一次快照。默认值对大多数场景是合理的可以先不动。更关键的是AOF。默认appendonly no意味着如果不开AOF从上一次RDB快照到宕机之间的所有写操作可能全部丢失。对生产业务来说这个损失窗口通常不可接受。建议改为appendonly yes appendfsync everysecappendfsync everysec是每秒刷盘一次极端情况下最多丢1秒的数据性能和数据安全之间取了个平衡点。如果数据丢了也能重建那可以不开AOF只要业务在乎最近几分钟的数据AOF就得开。内存上限是另一个默认值陷阱。Redis默认maxmemory不设意味着它会一直吃内存直到触发系统的OOM killer然后被内核直接杀掉。我建议按物理内存的60%到70%设置上限比如2G内存的机器maxmemory 1gb maxmemory-policy allkeys-lrumaxmemory-policy这里有个区分volatile-lru只对设置了过期时间的key生效如果业务里大量key根本没设过期时间它一个也淘汰不了Redis会直接开始拒绝写入allkeys-lru则对所有key生效兜底更彻底。第一次部署建议先用allkeys-lru后续再根据缓存场景调优。3.3 日志、慢日志、访问密码这些收尾设置日志位置已经在上面配置里写了这里再补慢日志slowlog-log-slower-than 10000 slowlog-max-len 128slowlog-log-slower-than 10000表示执行时间超过10毫秒的命令会被记录到慢日志单位是微秒所以10000就是10ms。通过redis-cli slowlog get可以查看排查线上问题非常有用。访问密码不能省requirepass 换成你自己的强密码客户端连接时有两种传密码的方式。一种是-a参数但不推荐因为密码会出现在shell历史里。更推荐用环境变量REDISCLI_AUTH你的密码 redis-cli ping如果后面要做主从复制还要记住一个坑从节点连主节点时需要配置masterauth否则从库会一直报SYNC鉴权失败。这个很容易漏等你在从库日志里看到这个报错就晚了。4. 用 systemd 托管 Redis别再让它在后台野跑4.1 为什么daemonize no supervised systemd更稳很多老教程喜欢让Redis自己daemonize yes然后配一个Typeforking的service文件。这种组合能工作但有个问题systemd对进程生命周期的感知是间接的Redis什么时候算真正启动完成、崩溃后能不能被正确识别为失败全靠猜测。更稳妥的做法是让Redis保持前台运行daemonize no并在配置里写supervised systemd。加上这一行后Redis会主动和systemd通信启动完成时通过NOTIFY_SOCKET告诉systemd我准备好了。对应的service文件用Typenotifysystemd就能精确感知Redis的启动状态和存活状态。这样做的实际收益是开机启动时依赖Redis的服务不会在Redis还没准备好就被拉起Redis异常退出后Restarton-failure能正确捕捉并重启它查看状态时systemctl status redis能看到准确信息。4.2 创建redis用户与目录权限生产环境不应该用root账户跑Redis服务。创建一个专用系统账户useradd -r -s /sbin/nologin -M redis如果系统提示找不到/sbin/nologin改成/usr/sbin/nologin再试。这个账户不能登录shell只用来跑Redis进程遵循最小权限原则。万一Redis被利用攻击者拿到的也只是这个低权限账户而不是root。接下来把Redis目录的属主改了chown -R redis:redis /usr/local/redis这一步必须做否则Redis进程以redis用户身份启动时写日志、写RDB、写AOF全都没有权限启动会直接报Permission denied。有的教程只建议chown data和log目录不过既然整个/usr/local/redis都是给Redis用的全部交给它反而省心。4.3 写service文件和启动流程在/etc/systemd/system/redis.service写入[Unit] DescriptionRedis Server Afternetwork.target [Service] Typenotify Userredis Groupredis RuntimeDirectoryredis ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf ExecReload/bin/kill -s HUP $MAINPID ExecStop/bin/kill -s TERM $MAINPID Restarton-failure RestartSec3 [Install] WantedBymulti-user.targetRuntimeDirectoryredis会在/run下自动创建redis目录并赋予redis账户属主权限所以我们在配置文件里把pidfile写成/run/redis/redis_6379.pid进程就能正常写入了。ExecReload用HUP信号实现配置平滑重载ExecStop用TERM信号优雅退出。注意不要用kill -9强制杀掉Redis可能留下写了一半的RDB或AOF文件。启动服务systemctl daemon-reload systemctl enable --now redis systemctl status redis能看到Active: active (running)就说明托管成功了。以后日常操作就用systemctl restart redis、systemctl reload redis不再需要手动找进程。5. 装完别急着走验证、压测和几个启动警告一起收拾掉5.1 用redis-cli和ss做一遍健康检查服务起来后先做最基础的连通性验证redis-cli -h 127.0.0.1 ping返回PONG说明服务正常。看版本和运行信息redis-cli info server再确认端口监听状态ss -lntp | grep 6379如果配置了密码把第一个命令换成REDISCLI_AUTH你的密码 redis-cli ping检查info里有几个关键指标值得看一眼uptime_in_seconds是运行时长connected_clients是当前连接数used_memory_human是内存占用。我习惯在这一步顺便看一眼info persistence确认rdb_last_save_time在更新AOF如果开了也处于正常状态。5.2 redis-benchmark压测基线怎么看自带的redis-benchmark工具可以快速摸一下这台机器的Redis性能基数redis-benchmark -n 100000 -c 50 -t set,get,incr -h 127.0.0.1输出会显示每个操作的requests per second也就是每秒请求数。不同机器差异很大虚拟机单实例通常在几万到十几万QPS之间物理机高配可以更高。第一次跑主要是为了建立基线以后业务上来了再跑一次对比能直观看到性能变化。压测时注意几点最好在单独一台机器上发起压测避免压测客户端和Redis抢资源压测期间AOF在刷盘所以数字会略低于纯内存场景这很正常别在业务高峰期对生产实例做全量压测。5.3 overcommit、THP、swappiness三个启动警告的处理如果你在systemctl status redis或日志里看到三个WARNING说明系统层有几个参数还没调。第一个是overcommit_memory。Redis做RDB快照时会fork一个子进程。Linux的内存overcommit策略如果是0内核可能拒绝一个看起来超量的内存申请导致fork失败、快照失败。建议改为1cat /etc/sysctl.conf EOF vm.overcommit_memory 1 vm.swappiness 1 net.core.somaxconn 1024 EOF sysctl -p第二个是Transparent Huge PagesTHP。这个特性在数据库场景下经常帮倒忙会把小内存页合并成大页fork时触发写复制反而放大内存开销造成延迟抖动。建议关闭echo never /sys/kernel/mm/transparent_hugepage/enabled要重启后依然生效需要把它写入/etc/rc.local并确认该文件有可执行权限或者做成一个systemd tmpfiles配置。第三个是swappiness表示系统倾向于使用swap的程度。默认值偏高时Redis内存页可能被换到磁盘导致延迟飙升。上面sysctl里已经写了vm.swappiness 1对Redis这类延迟敏感的服务是合理设置。net.core.somaxconn1024解决的是连接排队过浅的问题启动日志有时会提到TCP backlog限制一起调了省得再回来折腾。5.4 从这条流程里踩过的坑逐个说清楚第一个坑是GCC版本太老。我在一台老旧的CentOS 7机器上编译Redis 7.x中途直接报错最后排查下来是系统自带的GCC 4.8支持不了新特性。应急用了MALLOClibc绕过去但这不是正路后来升级GCC工具链再重新编译问题消失。如果你也遇到编译报错先看版本别急着改参数。第二个坑是主从同步鉴权失败。给主库设置了requirepass从库配置里忘了写masterauth结果从库一直报错权限不足。这是设置密码之后必然要踩的配套坑配置主从时记住两者要同步改。第三个坑是权限错误。有次我改完配置文件日志路径指向/usr/local/redis/log但没有提前chown这个目录启动后Redis直接报Cant open the log file: Permission denied。日志文件打不开问题排查难度直接翻倍。顺序很重要先创建用户、先chown目录再启动服务。第四个坑是裸奔公网。我见过有人图省事bind 0.0.0.0加上不设密码把Redis直接暴露到公网结果第二天数据就被扫描工具写了乱七八糟的key。Redis默认配置能挡住一部分但最稳妥的还是bind限制来源、设置强密码、防火墙别放开6379这三样至少要做两样。第五个坑是粗暴杀进程。有些同学觉得重启就是kill -9拿到PID一顿砍结果RDB文件写到一半重启后加载失败最后只能用redis-check-rdb慢慢修复。正常停止Redis就用systemctl stop redis进程收到TERM信号会做完该做的收尾工作再退出。这些坑大多不是Redis本身的问题而是安装方式、权限模型和进程托管方式选得不讲究。以我个人的经验源码编译加上独立用户、systemd托管、显式配置持久化和内存上限这套组合能让你在很长一段时间里不用回头折腾Redis。以后要升级版本重新编译一个前缀目录改一下service文件的ExecStart指向即可回滚也就是一行命令的事。Linux安装Redis的步骤网上到处都有但把每一步背后的选择讲明白的并不多希望这篇能帮你少走几次弯路。