
1. 整体思路与安装前准备1.1 为什么选择源码编译安装先聊一个很多人都会纠结的问题Linux下装Redis到底用包管理器装还是源码编译装我的建议很直接——学习阶段务必走一遍源码编译安装。理由有三点第一源码编译能让你清楚看到Redis的依赖关系、目录结构、可执行文件分布这是用apt install redis-server一行命令永远体会不到的第二生产环境的Redis通常需要定制安装路径、调整编译参数你要是只会包管理器遇到没有预编译包的发行版直接傻眼第三源码编译的排错过程本身就是在训练你读日志、查依赖的能力这种能力后面排查任何服务问题都用得上。当然如果你只是想在本地快速起一个Redis做开发测试用包管理器也没问题各取所需。但本文的核心思路就是走一遍下载、编译、配置、启动、验证的完整链路让你对Redis在Linux上的运行机制有一个全局认知。1.2 环境版本与前置条件核对在动手之前先把环境确认清楚避免做到一半才发现基础工具缺失。这里给出我实际使用的环境作为参照项目版本/说明操作系统CentOS 7.9 / Ubuntu 22.04两套我都实测过Redis 版本6.2.14稳定版特性均衡适合学习内核版本Linux 5.x / 3.10均不影响内存至少1GB空闲内存磁盘源码包约3MB编译后约30MB空间无忧安装前需要确认两个东西gcc编译器和make工具。因为Redis源码是用C语言写的编译过程必须有完整的编译工具链。缺了binutils或者make第一步就过不去。# 检查编译工具是否齐全 gcc --version make --version # 如果提示 command not found分别安装 # CentOS / RHEL 系列 sudo yum install -y gcc make # Ubuntu / Debian 系列 sudo apt update sudo apt install -y build-essential这里有个小坑Ubuntu的build-essential是一个元包它会自动把gcc、g、make、libc-dev这些基础编译组件一次装齐比单独装gcc再装make省事很多。而CentOS下直接装gcc和make就够了因为依赖关系比较简单。另外提一句如果你的机器上装了多个gcc版本建议用gcc --version看清楚默认版本。Redis 6.x对编译器要求不苛刻gcc 4.8以上都能正常编译这点比编译一些内核模块省心多了。1.3 从官网下载源码包的正确姿势下载Redis源码我强烈建议去官网 redis.io下载而不是随便找个镜像站或者第三方博客的网盘链接。官网下载能保证两个事一是版本号准确不会下到被二次打包的版本二是安全可控毕竟服务端程序是要跑在公网上的源码被篡改的后果不堪设想。Redis官网的下载地址在首页就能看到一般会同时给出稳定版和预发布版两个入口。新手一定认准stable版本不要看到数字最新就往上冲。# 创建一个专门的目录存放源码 mkdir -p ~/tools cd ~/tools # 下载 Redis 6.2.14以官网实际给出的稳定版为准 wget https://download.redis.io/releases/redis-6.2.14.tar.gz # 解压 tar xzf redis-6.2.14.tar.gz cd redis-6.2.14下载完成后先用ls -lh redis-6.2.14.tar.gz看一眼文件大小。正常应该在3MB多一点如果只有几十KB大概率是下载到了错误页面或者被网络中间层拦截了。这时候别急着解压重新下载比较靠谱。另外如果你所在的网络环境访问官网不稳定也可以用国内高校或云厂商的镜像源。但我的建议是直接配置阿里云或腾讯云的软件源镜像而不是随手搜一个个人站点。个人博客提供的下载链接最大的问题是你无法确认文件是否原封不动这点风险没必要冒。2. 编译安装全流程2.1 三步完成编译安装进入源码目录后整个编译安装过程可以概括为三步make、make test可选、make install。但实际执行的时候有几个细节需要留意。# 第一步编译源码 make # 如果编译过程报错提示缺少依赖可尝试清理后重新编译 make distclean # 第二步可选但推荐运行内置测试 make test # 第三步安装到系统 make install先说make这一步。Redis的Makefile写得比较完善默认会编译出redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-rdb、redis-sentinel这几个可执行文件。如果你只想要server和cli也可以指定编译目标比如make redis-server redis-cli但我建议全量编译因为后面的性能测试和故障排查都会用到其他工具。再说make test。这一步会跑一遍Redis自带的单元测试和集成测试耗时大概几分钟。虽然对于纯学习用途跳过这一步不影响安装但我还是建议跑一遍。这能验证你的编译环境是否正常、依赖是否完整而且能提前暴露一些运行时才会发现的问题。我第一次编译的时候跳过test直接install结果启动server时费了好大劲才排查出是由于系统缺少某个运行库导致如果当时老老实实跑一遍test日志里其实早就提示了。最后是make install。默认情况下所有可执行文件会被安装到/usr/local/bin目录。这个目录通常在PATH环境变量里所以安装完成后直接输redis-server就能启动不用写全路径比较方便。2.2 不指定PREFIX会发生什么这里要展开讲一个几乎人人都会踩的坑。很多教程会写make install PREFIX/usr/local/redis加上PREFIX参数的意图是让安装的二进制文件、配置文件统一落到/usr/local/redis目录下方便管理。但这里有个值得注意的机制PREFIX只影响安装路径不影响编译参数。如果你先执行了make再用make install PREFIX/xx安装实际上只是把编译好的文件复制到新目录并没有重新编译。但如果你在第一次编译时就指定了PREFIX后续目录结构会挂在PREFIX之下。比如Redis的配置文件默认读取路径、日志路径、数据目录的相对位置会和PREFIX关联。在我的实际经验里对于新手学习场景加PREFIX反而容易增加困惑。因为Redis启动时需要指定的配置文件路径、目录权限都要自己管理少了一步还容易出错。所以本文的安装方式我采用最保守的make install直接装到/usr/local/bin这是Redis官方推荐的默认行为也是绝大多数发行版包管理器的默认路径遇到问题网上能搜到的资料也最多。2.3 安装完成后的目录确认安装完成后先别急着启动。花一分钟确认一下可执行文件是否就位which redis-server which redis-cli # 查看文件详情 ls -lh /usr/local/bin/redis-server正常情况下which命令能打印出完整路径ls能看到文件大小大约在4MB左右。如果which找不到说明/usr/local/bin不在PATH里这时候需要手动加环境变量echo export PATH/usr/local/bin:$PATH ~/.bashrc source ~/.bashrc这一步做完整个安装环节就闭环了。从下载到编译到安装全链路跑通后面就是配置和启动的事。3. 配置文件与启动方式详解3.1 初始化配置文件的正确做法在源码目录里Redis自带一个redis.conf配置文件模板。安装完成后这个文件并不会自动复制到任何地方需要你手动把它放到你想要的管理位置。我习惯的做法是把配置文件放到/etc/redis/目录下这样和其它系统服务的配置风格保持一致也方便做备份和版本管理。# 创建配置目录 sudo mkdir -p /etc/redis # 复制模板配置 sudo cp ~/tools/redis-6.2.14/redis.conf /etc/redis/redis.conf # 创建数据目录用于存放RDB持久化文件 sudo mkdir -p /var/lib/redis # 创建日志目录 sudo mkdir -p /var/log/redis # 修改目录所有者让redis用户后面会创建能写入 sudo useradd -r -s /sbin/nologin redis sudo chown -R redis:redis /var/lib/redis /var/log/redis看到这里你可能会问为什么非要创建专门的redis用户直接拿root跑不行吗明确说一下不要用root跑Redis。原因有两层。第一层是安全问题Redis如果有远程访问权限一旦被攻击进程以root身份运行意味着攻击者可以获得系统的最高权限。第二层是容错问题Redis自身有daemonize、protected-mode、rename-command这些安全机制但任何机制都比不上最小权限原则。专门建一个没有登录Shell的系统用户来跑服务是Linux服务管理的通用做法Nginx、MySQL也都是这样干的。3.2 关键配置项逐条解读打开/etc/redis/redis.conf默认配置非常长几百行。但真正需要你动手改的其实只有以下几项。我把每一项的作用和推荐值帮你梳理清楚配置项默认值推荐值作用说明bind127.0.0.10.0.0.0 或 127.0.0.1控制监听地址0.0.0.0表示所有网卡可访问protected-modeyesyes保护模式禁止无密码远程访问port63796379默认监听端口daemonizenoyes是否后台运行设为yes后可以脱离终端pidfile/var/run/redis_6379.pid保持不变进程PID文件路径logfile空/var/log/redis/redis.log日志输出文件不设置则输出到stdoutdir.//var/lib/redisRDB和AOF持久化文件的存储目录requirepass空你自己设置访问密码强烈建议设置maxmemory0不限制视情况设置最大可用内存超过后按策略淘汰这里单独说两个坑。坑一bind和protected-mode的关系。如果你想要从别的机器访问Redis最常犯的错误是只把bind改成0.0.0.0然后忘了还有protected-mode yes。在Redis 3.2之后的版本里只要没有设置requirepass密码protected-mode就会拒绝来自非本机的连接。换句话说远程访问的两个必要条件bind设置密码或显式关闭protected-mode。我建议的做法是bind设成0.0.0.0同时一定设置requirepass并且保持protected-mode为yes这样的组合最稳妥。坑二dir配置项。Redis的RDB快照文件名是dump.rdb如果不设置dir快照会写到启动时的当前工作目录。你在哪个目录敲redis-server /etc/redis/redis.confdump.rdb就落到哪个目录非常容易丢。统一设置到/var/lib/redis之后就一劳永逸了。修改配置时可以用sed直接替换也可以用vim手动编辑。新手我建议用vim打开文件逐项搜索修改顺便熟悉一下配置文件的整体结构。3.3 前台启动与后台启动的区别至少在你第一次启动Redis时我推荐用前台方式启动一次看看完整日志输出# 前台方式启动 sudo -u redis redis-server /etc/redis/redis.conf如果配置文件里daemonize还是默认的noRedis会在前台运行所有日志直接打到终端。这一步能让你直观看到Redis启动过程中加载了哪些配置、监听了哪个端口、有没有报错。确认一切正常之后按CtrlC停掉再把配置文件改成daemonize yes之后就可以后台运行了。有些教程会教你用一个骚操作redis-server 加个后台符让它换到后台跑。这样确实也能跑但它不会脱离终端会话管理一旦SSH断开进程可能被挂掉。正规做法还是配置daemonize yes让Redis自己fork出守护进程这才是服务化的标准姿势。后台启动命令sudo -u redis redis-server /etc/redis/redis.conf # 确认进程状态 ps -ef | grep redis看到进程列表里有redis-server说明已经成功后台运行。这时候再用redis-cli连一下redis-cli -a 你的密码 ping如果返回PONG恭喜你Redis已经在Linux上跑起来了。4. 自启动配置与开机自动拉起4.1 为什么需要systemd服务管理到现在为止Redis是通过一条手动命令启动的。如果机器重启它不会自己起来。对于开发环境这还能忍但生产环境肯定不行。现在的Linux主流发行版都使用systemd作为系统和服务管理器。你可以把systemd理解成一个大管家负责在开机时按顺序拉起所有服务、监控服务状态、崩溃自动重启。把Redis交给systemd打理是比手动脚本更标准、可控的方案。写systemd服务文件之前必须先明确一点redis用户已经建好了目录权限也设置完了。如果之前跳过了回去补上否则service文件写得再漂亮启动时候也会因权限问题报错。4.2 编写redis.service文件新建服务文件/etc/systemd/system/redis.service内容我直接贴出来[Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typeforking Userredis Groupredis ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecReload/bin/kill -USR2 $MAINPID ExecStop/bin/kill -TERM $MAINPID PIDFile/var/run/redis_6379.pid Restarton-failure RestartSec5 LimitNOFILE65535 [Install] WantedBymulti-user.target逐个字段解释一下方便你理解每个配置的作用Typeforking表示Redis会以fork方式创建守护进程systemd要等主进程退出后确认守护进程存活才算启动成功。User/Groupredis以redis用户身份运行不解释。ExecStart启动命令注意必须写绝对路径。Restarton-failure进程异常退出时自动重启Redis如果是被kill -9杀掉或者自己crash掉systemd会帮你重新拉起。LimitNOFILE文件描述符上限。Redis在大量连接和持久化场景下会同时打开很多文件默认的1024根本不够这里提到65535比较稳妥。4.3 启用服务并验证开机自启写完服务文件后需要让systemd重新载入配置然后设置开机自启# 重新加载systemd配置 sudo systemctl daemon-reload # 设置开机自启动 sudo systemctl enable redis # 立即启动服务 sudo systemctl start redis # 查看服务状态 sudo systemctl status redisstatus输出里你应该看到Active: active (running)表示服务正在运行。用systemctl enable redis后系统重启后Redis会自动拉起。这一步做完你的Redis才算真正达到了“生产可用”的服务级别。再验证一下通过systemd启动的Redis是否正常响应redis-cli -a 你的密码 ping如果返回PONG就说明服务化配置完全正常。5. 常见问题与排查技巧实录5.1 编译阶段的问题错误一make时报jemalloc相关错误这个几乎是入门最常见的报错。Redis为了更好的内存分配性能默认使用了jemalloc内存分配库但有些系统的libc和jemalloc头文件不兼容编译就挂了。make[3]: *** [adlist.o] Error 1解决办法有两个。第一安装依赖库# Ubuntu/Debian sudo apt install -y libjemalloc-dev # CentOS/RHEL sudo yum install -y epel-release sudo yum install -y jemalloc-devel第二如果装完后还是报错可以退回libc内存分配器编译make distclean make MALLOClibcMALLOClibc的意思是放弃jemalloc改用系统标准的malloc。功能上几乎没差别只是性能上可能略逊一点学习阶段完全够用。错误二gcc: command not found这个是编译工具缺失直接用前面提到的安装命令补上gcc和make就行。如果是CentOS还可以顺手验证一下yum install -y gcc-c是否也装了因为有些C依赖编译也需要它。5.2 启动阶段的问题错误一可以使用systemctl enable redis后systemctl start redis失败先别慌用journalctl -u redis看详细日志sudo journalctl -u redis -n 50大多数情况下错误原因是/var/lib/redis或/var/log/redis的属主不是redis用户。仔细检查一下文件权限ls -ld /var/lib/redis /var/log/redis如果显示属主是root那就执行sudo chown -R redis:redis /var/lib/redis /var/log/redis错误二redis-server启动后立刻退出没有任何输出这种情况十有八九是配置文件里的dir目录不存在。Redis在启动时如果发现数据目录写不进去会直接自爆不给任何提示。你把dir指向的目录创建出来再检查一下属主即可。错误三从远程机器连接提示DENIED Redis is running in protected mode前面配置小节已经说过远程访问必须同时满足bind设置和requirepass或关闭protected-mode。这个报错是Redis的保护机制在起作用它主动拒绝不带密码的远程连接。正确做法是设置requirepass密码而不要直接把protected-mode改成no那等于把大门敞开安全上没有保障。5.3 一份排障速查表现象可能原因排查命令解决思路make报jemalloc错误缺少libjemalloc或头文件冲突rpm -qa / dpkg -l | grep jemalloc安装依赖或make MALLOClibcredis-cli连接提示Connection refusedRedis未启动或端口被防火墙拦截ps -ef | grep redis、ss -lntp | grep 6379启动Redis放行6379端口连接超时云安全组未放行端口firewall-cmd --list-ports在云控制台和系统防火墙放行redis-cli命令提示NOAUTH配置了requirepass但未带密码redis-cli -a 密码使用-a参数或AUTH命令数据重启后丢失持久化未开启或dir指向错误config get dir、config get save检查RDB/AOF配置和目录权限服务启动失败配置文件路径不对或权限问题systemctl status redis -l根据日志定位具体错误5.4 三个值得养成的操作习惯第一个习惯改动配置文件之前必须备份。cp /etc/redis/redis.conf /etc/redis/redis.conf.bak一分钟的事但能让你大胆试错改坏了随时还原。第二个习惯改完配置记得验证语法再重启。Redis提供了一个非常有用的命令redis-server /etc/redis/redis.conf --test-memory不对这是内存自检。验证配置语法应该用这个redis-server /etc/redis/redis.conf --check-system其实更准确的做法是直接前台启动看一眼输出5秒钟就能发现问题。如果你用的是systemd管理也可以systemctl restart redis后马上看status报错会直接显示出来。第三个习惯用redis-cli养成交互习惯。装完Redis后很多人只知道redis-cli ping然后就去上网搜GUI工具了。但Redis的命令行工具其实非常强大redis-cli --stat可以看实时统计redis-cli --bigkeys可以扫描大Keyredis-cli --latency可以测网络延迟。把cli玩熟了你排查问题的速度会快非常多。6. 安装后的验证与基础使用6.1 五条命令验证安装结果装好Redis只是第一步验证它确实在正常工作才是关键。我每次装完都会依次执行下面五条命令# 1. 查看版本 redis-server --version # 2. 查询进程状态 ps -ef | grep redis-server | grep -v grep # 3. 查看端口监听 ss -lntp | grep 6379 # 4. 命令行Ping redis-cli -a 你的密码 ping # 5. 查看当前正在执行的命令统计 redis-cli -a 你的密码 info stats | grep total_commands前三条是确认服务本身后两条是确认可访问性和响应能力。当total_commands这个计数器随着你执行命令而增长时说明整个读写链路是通的。再提一个细节如果日志里出现Warning: no config file specified, using the default config这句话说明你启动时没指定配置文件。虽然Redis也能用默认配置跑但默认配置不包含你之前设置的密码和数据目录所以务必养成redis-server /etc/redis/redis.conf这样的启动习惯。6.2 用String和Hash类型做一个简单练手Redis安装验证通过后强烈建议你用命令行做几个简单的读写操作把最基础的数据类型练一遍这比直接上连接工具更能加深对Redis的理解。# 认证如果配置了密码 AUTH 你的密码 # String类型 SET user:name zhangsan GET user:name # Hash类型 HSET user:1001 name lisi age 25 city beijing HGETALL user:1001 # 设置过期时间 SET session:token abc123 EX 60 TTL session:token这几个操作背后对应的知识点很实在String是最基本的KV结构Hash适合存储对象EX参数是设置过期时间。很多人上来就学分布式锁、缓存穿透、缓存雪崩但连SET和GET的基础语义都没吃透结果高级知识学得云里雾里。基础的数据类型操作尤其是过期时间、批量操作、事务这些才是Redis日常使用频率最高的部分。6.3 查看运行状态的核心指标最后分享这几个运维常用的监控命令它们能帮你判断Redis的运行是否健康# 查看全部信息 redis-cli -a 你的密码 info # 只看内存信息 redis-cli -a 你的密码 info memory # 查看客户端连接 redis-cli -a 你的密码 client list # 查看持久化统计 redis-cli -a 你的密码 info persistence这里需要重点盯一下used_memory和used_memory_human这是Redis实际占用的内存。如果发现内存一路涨回不去需要结合maxmemory和过期策略一起看。另外connected_clients如果异常升高要考虑是不是业务代码里忘了关闭连接。实际上我在自己搭环境的时候总会顺手把info commandstats打出来看看这个命令能统计各类命令的执行次数和耗时对于后续分析业务里哪些命令是热点、哪些是慢操作非常有帮助。学到这你对Redis安装后的日常维护基本上心里有数了。说说我个人装了这么多遍Redis的一点体会吧。安装本身并不难真正难的是每一次排错过程中积累的细节。你踩过的坑越多后面维护生产环境就越沉稳。如果你刚装好Redis别急着去配集群、搞哨兵先把单机的基本功打扎实然后试着把服务用systemd管起来、把持久化配置研究透、把命令行工具用顺再往后学任何分布式玩法都会轻松很多。