Redis 3.0.2 Linux 源码编译、服务化与远程连接实战避坑指南

发布时间:2026/10/22 18:02:32
Redis 3.0.2 Linux 源码编译、服务化与远程连接实战避坑指南
简介这份PDF资料面向在Linux环境下部署Redis的运维与开发人员系统讲解从源码安装、启动停止到将Redis注册为系统服务的完整流程适合刚接触Redis服务化配置、需要解决Java客户端远程连接问题的初中级使用者。资源包共1个PDF文件大小约261KB内容以命令与配置说明为主便于随时查阅对照。资料围绕下载解压、make编译、redis-server与redis-cli的使用展开重点说明如何复制初始化脚本、修改chkconfig与PID路径、注册并启停服务同时给出Java客户端连接失败时注释bind绑定、设置requirepass密码及关闭保护模式的排错思路。目前已有13628人学习下载可作为Linux下Redis服务化部署与常见连接问题排查的实用参考。1. 从一台“裸奔”的测试机说起Redis 3.0.2 在 Linux 上到底怎么落地很多同行第一次在 Linux 上装 Redis都是被“编译完就能跑”这句话带进沟里的。真实场景往往是这样拿到一台刚装好的 CentOS 或 Ubuntu 测试机网络时通时断源码包版本是 redis-3.0.2.tar.gz解压、make 之后确实能看到 redis-server 和 redis-cli但一旦关掉终端服务就没了想用 service redis start 管理又发现脚本里 PID 文件路径对不上。这套流程解决的不是“Redis 是什么”而是“怎么让它在 Linux 上稳定地启动、停止、做成服务并且让 Java 客户端连得上”。适合刚接手中间件运维的后端开发、需要把 Redis 集成进现有系统的实施人员以及被“protected mode”和 bind 配置卡过一晚上的同行。下面按我实际拆包的顺序把安装、编译、服务化、远程连接这几段一次讲透。2. 源码编译与目录规划为什么我不建议直接 wget 官方源2.1 下载与解压绕开不可达的下载源项目正文里提到用 wget 拉 redis-3.0.2.tar.gz但实际执行时大概率会卡在连接阶段。常见做法是提前在能访问的机器上下好包再通过 scp 或共享目录传到目标 Linux 服务器。这一步不涉及任何网络加速手段纯粹是“换一台能下的机器下好再传”。# 假设安装包已经上传到 /usr/local/src cd /usr/local/src tar -zxvf redis-3.0.2.tar.gz # 解压后得到 redis-3.0.2 目录 ls -ld redis-3.0.2tar 的 -z 表示 gzip 解压-x 是提取-v 显示过程-f 指定文件。解压后不要急着 make先确认目录属主和磁盘空间Redis 编译产物不大但 /usr/local 分区如果只剩几十兆make 到一半会报 No space left on device。2.2 make 编译10 分钟背后要看什么进入目录直接执行 make等待时间取决于机器性能项目正文说 10 分钟左右实际在 2 核 4G 的虚拟机上差不多就是这个量级。cd /usr/local/src/redis-3.0.2 make # 编译完成后检查关键二进制 ls -l src/redis-server src/redis-cli编译成功后src 目录下会生成 redis-server、redis-cli、redis-benchmark 等可执行文件。这里有个容易忽略的点项目正文说“在该目录下输入 ./redis-server”指的是解压后的根目录但 3.0.2 版本编译后二进制实际在 src 子目录里。如果你在根目录直接执行 ./redis-server 报 not found先确认是不是路径问题。提示make 过程中如果报 jemalloc 相关错误常见原因是缺少 gcc 或 make 工具链先执行 yum install -y gcc make 或 apt install -y build-essential。2.3 前台启动验证先别急着做成服务在服务化之前一定要先用前台方式跑一次确认二进制本身没问题。# 在 src 目录下前台启动默认端口 6379 ./redis-server # 另开一个终端用客户端连接测试 ./redis-cli -p 6379 127.0.0.1:6379 set testkey hello 127.0.0.1:6379 get testkeyredis-cli 的 -p 指定端口默认就是 6379写不写都行。set/get 能正常返回说明服务端和客户端都工作正常。这一步验证通过后再做服务化否则后面 service 启动失败你分不清是脚本问题还是二进制问题。3. 把 Redis 做成系统服务init 脚本改造与 PID 文件纠偏3.1 复制初始化脚本并补齐 chkconfig 头Redis 源码包里自带一个 utils/redis_init_script这是官方给的 SysV init 模板。把它复制到 /etc/init.d 下并改名为 redis。cp /usr/local/src/redis-3.0.2/utils/redis_init_script /etc/init.d/redis chmod x /etc/init.d/redis vi /etc/init.d/redis打开后第二行需要手动加上 chkconfig 的注释头否则 chkconfig --add 会报“service redis does not support chkconfig”。#!/bin/sh # chkconfig: 2345 80 90 # description: Redis is a persistent key-value database2345 表示在运行级别 2、3、4、5 下启动80 是启动优先级90 是停止优先级。这个数字不要求精确但要比依赖它的服务早启动、晚停止。3.2 配置文件路径与二进制路径对齐脚本里有一行 CONF/etc/redis/${REDISPORT}.conf意味着它去 /etc/redis/ 下找以端口号命名的配置文件。所以需要建目录并拷贝配置。mkdir -p /etc/redis cp /usr/local/src/redis-3.0.2/redis.conf /etc/redis/6379.conf同时脚本默认去 /usr/local/redis/bin 找 redis-server 和 redis-cli。如果编译产物还在 src 目录要么复制过去要么改脚本里的 EXEC 路径。mkdir -p /usr/local/redis/bin cp /usr/local/src/redis-3.0.2/src/redis-server /usr/local/redis/bin/ cp /usr/local/src/redis-3.0.2/src/redis-cli /usr/local/redis/bin/3.3 后台启动与 PID 文件修正脚本里 $EXEC $CONF 这一行后面要加 否则 service redis start 会占住当前终端不返回。# 修改前 $EXEC $CONF # 修改后 $EXEC $CONF 项目正文里提到的 PID 文件不匹配问题非常典型脚本里写的是 redis_${REDISPORT}.pid实际运行时生成的是 redis.pid导致 service redis stop 报 “/var/run/redis_6379.pid does not exist”。# 在 /etc/init.d/redis 中找到 PIDFILE 相关行 # 将 redis_${REDISPORT}.pid 改为 redis.pid sed -i s/redis_${REDISPORT}.pid/redis.pid/ /etc/init.d/redis改完后注册并启动服务。chkconfig --add redis service redis start service redis status如果启动时报 “redis-server: command not found”回到 3.2 检查 /usr/local/redis/bin 下是否有二进制文件。如果 stop 时仍然提示 PID 不存在先确认 /var/run/redis.pid 是否真的生成可以用 ps -ef | grep redis 看进程是否在跑。4. 远程连接与 protected modeJava 客户端连不上的排查路径4.1 bind 配置为什么 telnet 不通Java 客户端连接超时第一步不是改代码而是从客户端机器 telnet 目标 IP 和端口。telnet 192.168.0.104 6379如果端口不通但同一台机器其他端口能通基本可以锁定是 Redis 自身配置问题。打开 /etc/redis/6379.conf找到 bind 行。# 默认配置 bind 127.0.0.1 # 改为注释掉允许所有网卡监听 # bind 127.0.0.1改完后 service redis restart再次 telnet 应该就能通了。这里要注意注释 bind 只是让 Redis 监听所有网卡不等于安全配置到位生产环境还要配合防火墙规则。4.2 protected modeDENIED 报错的两种解法端口通了之后Java 客户端可能收到 “DENIED Redis is running in protected mode” 错误。这是 Redis 3.2 之后引入的保护机制3.0.2 版本本身没有这个默认行为但如果配置文件里 protected-mode yes 且没有绑定密码就会触发。解法一是在配置文件里设置密码。# 在 6379.conf 中取消注释并修改 requirepass YourStrongPassword解法二是在运行时通过 config set 动态设置。redis-cli -p 6379 127.0.0.1:6379 config set requirepass 123设置后客户端连接需要带密码。Java 侧用 Jedis 的话配置如下。Jedis jedis new Jedis(192.168.0.104, 6379); jedis.auth(123); jedis.set(foo, bar); String value jedis.get(foo);auth 必须在任何命令之前调用否则会抛 JedisDataException。如果密码里包含特殊字符建议用配置文件方式而不是命令行避免 shell 转义问题。4.3 停止命令与进程残留服务化之后停止 Redis 用 service redis stop。但有时会遇到 stop 执行了进程还在的情况常见原因是 PID 文件被手动删除或路径不对。# 确认进程 ps -ef | grep redis-server # 如果 service stop 无效先修正 PID 文件路径再重启服务 service redis restart service redis stop如果确实需要强制停止用 kill 加进程号但要注意先 save 再 kill否则可能丢数据。redis-cli -p 6379 -a 123 shutdownshutdown 命令会先持久化再退出比直接 kill -9 安全得多。5. 避坑与排查五个真实翻车记录现象一make 编译到一半报 “cc: command not found”。原因目标机器是最小化安装没有 gcc 编译器。 解决先装编译工具链yum install -y gcc make 或 apt install -y build-essential再重新 make。现象二service redis start 后终端卡住不返回。原因init 脚本里 $EXEC $CONF 后面没有加 Redis 以前台方式运行。 解决在 /etc/init.d/redis 中该行末尾补 保存后 service redis restart。现象三service redis stop 提示 PID 文件不存在。原因脚本里 PIDFILE 写的是 redis_6379.pid实际生成的是 redis.pid。 解决把脚本中 redis_${REDISPORT}.pid 统一改成 redis.pid重启服务后再 stop。现象四Java 客户端 telnet 端口不通。原因redis.conf 里 bind 127.0.0.1 只监听本地回环。 解决注释 bind 行重启服务同时确认服务器防火墙放行 6379 端口。现象五端口通了但报 protected mode DENIED。原因未设置 requirepass 且 protected-mode 处于开启状态。 解决在配置文件中设置 requirepass或在运行时 config set requirepass客户端连接时调用 auth。6. 进阶技巧用 redis-cli 做服务健康检查与配置热更新服务跑起来只是第一步日常运维更关心“它还活着吗”和“改配置要不要重启”。我一般会在部署脚本里加一段健康检查用 redis-cli 的 ping 和 info 做双重确认。#!/bin/bash # redis_health_check.sh REDIS_PORT6379 REDIS_PASS123 # ping 检查连通性 PONG$(redis-cli -p $REDIS_PORT -a $REDIS_PASS ping 2/dev/null) if [ $PONG ! PONG ]; then echo CRITICAL: redis ping failed exit 2 fi # 检查关键指标 CONNECTED$(redis-cli -p $REDIS_PORT -a $REDIS_PASS info clients | grep connected_clients | cut -d: -f2 | tr -d \r) USED_MEM$(redis-cli -p $REDIS_PORT -a $REDIS_PASS info memory | grep used_memory_human | cut -d: -f2 | tr -d \r) echo OK: clients$CONNECTED memory$USED_MEM exit 0这个脚本可以直接挂到 crontab 里每分钟跑一次或者接入现有的监控系统。ping 返回 PONG 说明服务进程正常info clients 和 info memory 能拿到数值说明配置加载正常。如果 ping 通但 info 报错通常是权限问题检查 requirepass 是否和脚本里一致。另一个实用技巧是 config set 热更新。比如临时调整 maxmemory 或 timeout不需要重启服务。redis-cli -p 6379 -a 123 config set maxmemory 256mb redis-cli -p 6379 -a 123 config get maxmemory但要注意config set 的修改不会写回配置文件重启后就丢了。所以热更新只适合临时调整长期生效还是要改 /etc/redis/6379.conf 再重启。我自己的习惯是任何 config set 之后立刻把对应参数写进配置文件避免下次重启后“玄学”失效。从那以后我每次做完 Redis 服务化都会强制走一遍“前台启动验证 → 服务启动验证 → 远程 telnet 验证 → 客户端 auth 验证”这四步少一步都可能在后半夜被叫起来排查。希望帮到你。本文还有配套的精品资源点击获取