简介:这份PDF文档面向在Linux环境下部署Redis的运维与开发人员,系统讲解从源码编译到将Redis注册为系统服务的完整流程,帮助读者解决手动启动繁琐、服务无法随系统自启以及Java客户端远程连接失败等常见问题。资源包内含1个PDF文件,大小约261KB,内容涵盖解压编译、启动停止命令、初始化脚本配置、chkconfig注册服务,以及保护模式与bind绑定导致的连接异常排查思路,适合具备一定Linux基础、希望把Redis纳入服务化管理的读者参考。目前已有13628人学习下载,文档对PID文件路径、配置文件拷贝位置等易错细节均有说明,可作为安装配置与故障排查的速查手册。
1. 详解 Linux 下 Redis 安装、启动与停止:为什么“能跑起来”和“做成服务”是两回事
很多人在 Linux 下第一次装 Redis,流程都差不多:下载、解压、make、src/redis-server一敲,看到那个方块 Logo 和Ready to accept connections,就觉得装完了。结果服务器一重启,Redis 没了;关掉终端窗口,进程也跟着挂了。这就是典型的“能跑起来”和“做成服务”之间的差距。
这篇笔记要解决的就是这条完整链路:在 Linux 下把 Redis 装好、用对启动方式、能干净地停止、最后交给 systemd 做成开机自启的常驻服务。适合两类人:一类是刚接手一台新机器、需要快速把 Redis 跑起来的新手;另一类是用过 Redis 但一直靠nohup或screen硬撑、想换成正规服务管理的熟手。中间会讲到编译参数、配置文件里几个必调项、systemd 单元怎么写,以及我自己踩过的几个坑。
2. 装 Redis 之前先想清楚:源码编译还是包管理器
2.1 两种安装路径的取舍
Linux 下装 Redis 常见就两条路:发行版自带的包管理器(apt、yum、dnf),或者去官网拉源码自己编译。这两条路没有绝对优劣,取决于你要什么。
包管理器安装的好处是省事,一条命令搞定,依赖、systemd 单元、日志轮转都帮你配好了。缺点是版本通常偏旧,发行版仓库里的 Redis 可能落后官方好几个大版本,某些新命令、新配置项用不了。如果你只是拿 Redis 当缓存,对版本不敏感,包管理器是最省心的选择。
源码编译的好处是版本可控,想要哪个版本就编哪个版本,编译参数也能自己调(比如指定安装目录、开启 TLS)。代价是依赖要自己装、服务要自己配、升级要自己管。生产环境里我一般倾向源码编译,因为版本统一、路径可控,出问题好排查。
判断标准很简单:如果这台机器上的 Redis 只是临时用、或者团队没有统一版本要求,包管理器够了;如果是要长期跑、要进配置管理、要跟其他环境保持一致,源码编译更稳。
2.2 源码编译的完整命令与参数说明
先装编译依赖。Redis 是 C 写的,需要编译器和一些基础库:
# Debian/Ubuntu 系 sudo apt update sudo apt install -y build-essential tcl pkg-config # RHEL/CentOS 系 sudo yum install -y gcc make tcl pkgconfigbuild-essential里包含 gcc、make 等;tcl是跑 Redis 自带测试套件需要的,不跑测试可以不装,但建议装上,编译完能验证一下;pkg-config在较新版本里会用到。
接着下载源码并编译。这里用官方下载页给的稳定版压缩包,具体版本号以你实际拿到的为准:
# 下载源码包(版本号按实际替换) wget https://download.redis.io/releases/redis-x.y.z.tar.gz tar -xzf redis-x.y.z.tar.gz cd redis-x.y.z # 编译,-j 后面跟 CPU 核数,加快速度 make -j$(nproc) # 可选:跑一遍测试,确认编译产物没问题 make test # 安装到指定前缀目录 sudo make PREFIX=/usr/local/redis installmake -j$(nproc)里的$(nproc)会自动取当前机器的 CPU 核数,并行编译能快不少。make test会跑一套回归测试,耗时几分钟,第一次编译建议跑,能提前发现环境问题。make PREFIX=/usr/local/redis install把可执行文件装到/usr/local/redis/bin,这样跟系统自带的路径隔离开,后面配服务时路径清晰。
安装完检查一下产物:
ls /usr/local/redis/bin # 应该能看到 redis-server、redis-cli、redis-benchmark 等redis-server是服务端,redis-cli是命令行客户端,redis-benchmark是压测工具。这三个是最常用的。
2.3 目录规划:配置文件、数据、日志分开放
源码编译默认不会帮你建配置目录和数据目录,得自己规划。我一般按这个结构来:
sudo mkdir -p /usr/local/redis/conf sudo mkdir -p /var/lib/redis sudo mkdir -p /var/log/redis # 把源码里的示例配置拷过去做基础 sudo cp redis.conf /usr/local/redis/conf/redis.conf # 数据目录和日志目录的属主给运行 Redis 的用户 sudo chown -R redis:redis /var/lib/redis /var/log/redis配置文件、数据文件(RDB、AOF)、日志分三个地方放,好处是备份和排查都清晰:备份只盯/var/lib/redis,看日志只去/var/log/redis,改配置只动/usr/local/redis/conf。混在一起的话,时间一长自己都记不清哪个文件是干嘛的。
提示:如果系统里还没有
redis这个用户,先建一个专用账号,别用 root 跑 Redis。sudo useradd -r -s /sbin/nologin redis建一个不能登录的系统账号即可。
3. 启动与停止:前台、后台、命令行三种方式怎么选
3.1 前台启动与后台启动的区别
最原始的启动方式就是直接跑二进制:
# 前台启动,日志直接打到终端 /usr/local/redis/bin/redis-server # 指定配置文件启动 /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf前台启动的好处是日志实时可见,调试配置时最直观。坏处是终端一关进程就没了,而且占着一个终端。这种方式只适合临时验证,不适合长期跑。
后台启动靠配置文件里的daemonize参数:
# 在 redis.conf 里改 daemonize yes pidfile /var/run/redis.pid logfile /var/log/redis/redis.logdaemonize yes让 Redis 以守护进程方式跑在后台;pidfile记录进程号,停止和排查时要用;logfile指定日志文件,不配的话日志会丢到/dev/null,出问题什么都看不到。改完再启动就是后台模式了。
但要注意:daemonize yes和 systemd 管理是冲突的。systemd 要求服务进程在前台运行,它自己负责守护。如果你既开了daemonize yes又用 systemd 拉起,systemd 会以为进程退出了,反复重启。这是后面做服务时最容易翻车的点之一。
3.2 停止 Redis 的三种正确姿势
停止 Redis 不是kill -9就完事,粗暴杀进程可能导致数据没落盘。正确做法有三种:
第一种,用客户端发关闭命令:
/usr/local/redis/bin/redis-cli shutdown这是最推荐的方式。shutdown会让 Redis 先做持久化(如果配了 RDB/AOF),再干净退出。如果 Redis 设了密码,要先-a带密码,或者进交互模式auth。
第二种,带参数控制是否持久化:
# 不保存直接关,快但可能丢数据 redis-cli shutdown nosave # 强制保存再关 redis-cli shutdown savenosave适合纯缓存场景,数据丢了能从源头重建;save适合数据重要的场景,确保关之前落盘。
第三种,用系统信号:
# 先查进程号 cat /var/run/redis.pid # 发 TERM 信号,等价于 shutdown kill -TERM $(cat /var/run/redis.pid)kill -TERM会触发 Redis 的优雅退出流程,效果和shutdown类似。但kill -9(SIGKILL)是强杀,Redis 来不及做任何清理,除非进程真的卡死,否则别用。
3.3 验证启动状态和端口监听
启动完别急着走,确认三件事:进程在不在、端口通不通、能不能读写。
# 看进程 ps -ef | grep redis-server # 看端口监听 ss -lntp | grep 6379 # 用客户端 ping 一下 /usr/local/redis/bin/redis-cli ping # 返回 PONG 就正常 # 简单读写测试 redis-cli set testkey hello redis-cli get testkeyss -lntp比netstat快,-l看监听,-n不解析端口名,-t看 TCP,-p显示进程。如果端口没起来,先看日志/var/log/redis/redis.log,常见原因是配置文件里bind绑了127.0.0.1导致外部连不上,或者protected-mode开着拒绝了外部连接。
4. 把 Redis 做成 systemd 服务:单元文件怎么写
4.1 先改配置文件,再写单元文件
做服务之前,配置文件里有两处必须先改,否则 systemd 拉起会出问题。
第一处,关掉daemonize:
# /usr/local/redis/conf/redis.conf daemonize nosystemd 自己管守护,Redis 必须前台跑。
第二处,确认supervised参数。较新版本的 Redis 支持supervised systemd,设成这个之后 Redis 会和 systemd 做状态同步:
supervised systemd如果版本不支持这个参数,保持默认no也行,不影响 systemd 拉起,只是状态通知没那么精细。
另外把pidfile、logfile、dir都指向之前规划好的目录:
pidfile /var/run/redis/redis.pid logfile /var/log/redis/redis.log dir /var/lib/redisdir是 RDB/AOF 文件的落盘目录,一定要指向有写权限、空间够的地方。
4.2 systemd 单元文件的完整写法
在/etc/systemd/system/下建一个redis.service:
[Unit] Description=Redis In-Memory Data Store After=network.target [Service] Type=notify User=redis Group=redis ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecStop=/usr/local/redis/bin/redis-cli shutdown Restart=always RestartSec=3 LimitNOFILE=65535 [Install] WantedBy=multi-user.target逐项说明。After=network.target表示网络就绪后再启动。Type=notify配合配置里的supervised systemd使用,Redis 会主动通知 systemd 自己就绪了;如果配置里没开supervised systemd,这里要改成Type=simple,否则 systemd 会一直等通知,启动超时。User/Group指定运行账号,别用 root。ExecStart是启动命令,必须带配置文件路径。ExecStop是停止命令,用redis-cli shutdown保证优雅退出。Restart=always让进程意外退出时自动拉起,RestartSec=3是重启间隔。LimitNOFILE=65535提高文件描述符上限,Redis 高并发时连接数多,默认的 1024 容易不够。
4.3 加载、启动、开机自启与状态检查
单元文件写好后,按顺序执行:
# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start redis # 设置开机自启 sudo systemctl enable redis # 查看状态 sudo systemctl status redisdaemon-reload是必须的,改了单元文件不 reload,systemd 用的还是旧配置。enable会在multi-user.target.wants下建软链接,实现开机自启。status能看到运行状态、最近日志、进程号。
停止和重启:
sudo systemctl stop redis sudo systemctl restart redis如果status显示failed,用journalctl -u redis -n 50看最近 50 行日志,比翻日志文件快。常见失败原因:路径写错、权限不对、Type和supervised不匹配、配置文件语法错误。
5. 避坑与排查:这几个问题我几乎每次都遇到
5.1 坑一:systemd 启动超时,状态一直 activating
现象:systemctl start redis卡住,最后报Job for redis.service timed out,status显示activating (start)。
原因:单元文件里写了Type=notify,但配置文件里没开supervised systemd,Redis 不会发就绪通知,systemd 一直等。
解决:两边保持一致。要么配置里加supervised systemd,要么单元文件改成Type=simple。改完daemon-reload再重启。
5.2 坑二:重启机器后 Redis 没起来
现象:手动systemctl start能起来,重启机器后 Redis 不在。
原因:忘了systemctl enable redis,或者enable了但单元文件后来改过没重新enable。
解决:systemctl is-enabled redis确认状态,不是enabled就补上。改过单元文件后,daemon-reload加enable一起做。
5.3 坑三:外部连不上,本地 redis-cli 正常
现象:本机redis-cli ping返回 PONG,但从别的机器连 6379 连不上。
原因:配置文件里bind 127.0.0.1只绑了本地回环,或者protected-mode yes在没设密码时拒绝外部连接。
解决:要对外提供服务,把bind改成0.0.0.0(或指定内网 IP),同时设requirepass加密码,再把protected-mode保持yes。千万别在无密码的情况下把protected-mode关掉对外暴露,这是被扫的高危配置。
5.4 坑四:日志文件是空的,排查没线索
现象:Redis 起不来,去看/var/log/redis/redis.log,文件是空的或者根本不存在。
原因:配置文件里logfile写的是相对路径或空字符串,Redis 把日志丢到了/dev/null;或者日志目录属主不对,Redis 没权限写。
解决:logfile写绝对路径,确认目录存在且属主是运行账号。临时排查可以先把logfile ""改成空,让日志打到标准输出,用journalctl -u redis看。
5.5 坑五:kill -9 之后数据文件损坏
现象:进程卡死,有人直接kill -9,重启后 Redis 报 RDB 文件格式错误,起不来。
原因:kill -9不给进程清理机会,正在写 RDB 或 AOF 时被杀,文件写了一半。
解决:优先用redis-cli shutdown或systemctl stop。真卡死了必须强杀,重启前先备份数据目录,用redis-check-rdb、redis-check-aof检查修复。AOF 损坏可以用redis-check-aof --fix尝试修复,RDB 损坏基本只能靠备份。
6. 进阶:用 redis-cli 做服务健康检查与配置热更新
服务跑起来只是开始,日常运维里有两件事值得单独练熟:健康检查和配置热更新。
健康检查不要只看进程在不在,进程活着但拒绝服务的情况很常见(比如内存打满、被阻塞)。我一般用redis-cli做几层探测:
# 第一层:连通性 redis-cli -h 127.0.0.1 -p 6379 ping # 第二层:带密码的连通性 redis-cli -h 127.0.0.1 -p 6379 -a yourpassword --no-auth-warning ping # 第三层:看关键指标 redis-cli info memory | grep used_memory_human redis-cli info clients | grep connected_clients redis-cli info stats | grep rejected_connections--no-auth-warning是较新版本加的,避免密码写在命令行时刷警告。info memory看内存用量,info clients看当前连接数,info stats里的rejected_connections如果持续增长,说明连接数超了maxclients,得调。
配置热更新是 Redis 很实用的一个能力,很多参数不用重启就能改:
# 查看当前配置 redis-cli config get maxmemory # 动态修改,立即生效但不写回配置文件 redis-cli config set maxmemory 2gb # 把当前配置写回配置文件,重启后仍生效 redis-cli config rewriteconfig set改的是运行时配置,重启就没了;config rewrite会把当前运行时配置写回redis.conf,这样重启后还在。注意config rewrite会重写整个配置文件,注释和格式可能丢失,改之前先备份一份。
不是所有参数都能热更新,像port、bind、daemonize这类启动相关的必须改配置文件重启。能热更新的通常是maxmemory、maxmemory-policy、appendonly、save这些运行期参数。改之前用config get确认当前值,改完再config get验证一遍。
最后说个我自己的习惯:每次改完配置,不管热更新还是改文件,都先redis-cli config get核对一遍,再systemctl restart走一次完整重启验证。热更新成功不代表配置文件写对了,两者都过一遍才踏实。这套流程帮我挡过好几次“改了没生效”的玄学问题。希望帮到你。
本文还有配套的精品资源,点击获取