
1. 为什么还要写Redis 6.2.6的下载和安装老同学前几天问我Redis 6.2.6怎么装我愣了一下。现在网上到处都是Redis 7.x甚至8.x的教程怎么还有人回过头装6.2.6聊了几句才明白他们公司生产环境跑的核心业务系统技术栈是几年前定的Redis版本锁定在6.2.6不能随便升级。这个情况在真实的运维环境里太常见了——新版本功能再香生产环境说不动就不动稳定性压倒一切。Redis 6.2.6这个版本说老也不算太老它是2021年11月初发布的维护版本主要修复了之前版本里一些潜在的安全问题和bug整体非常稳定。它属于Redis 6.2.x系列的小版本在6.0引入多线程IO和客户端缓存之后6.2版本又补了一轮命令和协议层面的优化。对于大多数业务场景——缓存、会话共享、分布式锁、排行榜、消息队列——6.2.6的性能和功能完全够用。这篇文章我把从下载到安装的完整流程以及这中间容易踩的坑全部整理出来。不管你是刚接触Redis的新手还是在公司里负责运维的老手需要快速在测试机部署一套都可以直接照着操作。文章里不只写“怎么装”还会解释“为什么这样做”“遇到报错怎么排查”。2. 准备工作下载前需要确定的事情2.1 环境检查确认系统基本信息动手之前先把服务器环境搞清楚。我见过很多人直接复制网上的命令就开干结果因为环境不同卡在编译阶段折腾半天。打开终端依次执行三个命令cat /etc/redhat-release # 或者用cat /etc/os-release能看更全的信息 uname -m # 常见输出x86_64intel/amd 64位、aarch64arm架构、armv7l32位arm gcc --version # 如果提示command not found说明还没装gcc后面部分会讲怎么补你至少要确认三件事操作系统发行版和版本CentOS 7、CentOS 8、Ubuntu 20.04不同系统的包管理器和个别依赖的处理方式有差异。系统架构现在绝大多数服务器是x86_64但如果你在ARM平台的机器上装编译参数和依赖库的选择会不一样。编译工具链Redis源码是C语言写的安装过程需要gcc编译器。CentOS 7自带的gcc版本是4.8.5编译Redis 6.2.6会遇到一个坑下面3.3节我会专门讲。2.2 版本确认6.2.6这个版本有什么特点Redis版本命名规则是大版本.功能版本.维护版本。6.2.6就是6.2功能系列的第6个维护版本。Redis官方从6.2开始对维护版本的支持策略是在大版本发布后持续维护约三年左右。6.2.x系列在技术上引入了一些值得一提的能力Redis 6.0开始支持多线程IO这解决了网络读写瓶颈问题但是执行命令的核心部分仍然是单线程所以用的时候不要误会成“Redis变成多线程了”。客户端缓存Client-side caching这个功能可以让应用在本地缓存Redis数据减少网络消耗6.2版本里做了进一步改进。新的命令和协议优化比如增加了GETDEL、HRANDFIELD等命令并且在某些场景下提升了大key操作的处理效率。ACL权限控制更成熟6.0引入ACL之后6.2版本在命令分类和权限管理上做了完善这在多团队共享Redis实例时非常有用。对于生产环境来说选6.2.6而不是6.2.0是因为维护版本会累积修复内存泄漏、极端并发下的崩溃等棘手问题。安装软件千万不要选x.0的版本等几个维护版本再上这是运维的常识。2.3 安装方式选型为什么推荐源码编译Redis在不同系统下有多种安装渠道常见的有源码编译安装从官网下载源码包自己编译。最灵活可以指定安装路径、开启特定编译选项也是官方推荐的方式。系统包管理器安装yum install redis或apt install redis。优点是方便缺点是版本通常比较旧而且不一定能在默认源里找到你想要的6.2.6。Docker镜像安装docker pull redis:6.2.6。部署效率最高适合容器化环境但如果你的业务对网络性能要求极高或者需要和宿主机做深度集成直接跑在裸机上更合适。这篇文章以源码编译安装为主原因很简单它能让你完整控制整个过程出了问题自己心里有数。作为运维人员服务器上跑了什么软件、怎么编译的、装到了哪个目录这些都应该清清楚楚。3. 下载Redis 6.2.6安装包3.1 从哪里下载官方地址和镜像站Redis的官方下载地址是https://download.redis.io/releases/在这个目录下你能找到所有历史版本的源码包。对应6.2.6文件名是redis-6.2.6.tar.gz文件大小大约2.5MB左右很小的包下载速度基本不是问题。不过国内服务器从官方站点下载有时候会不太稳定。我比较推荐用国内镜像站下载速度快很多华为云镜像https://mirrors.huaweicloud.com/redis/阿里云镜像https://mirrors.aliyun.com/redis/阿里云的镜像地址值得专门说一句因为它还提供了redis-stable最新稳定版的下载如果你以后需要装新版本可以直接用wget https://mirrors.aliyun.com/redis/redis-6.2.6.tar.gz3.2 下载和校验确保下载的文件完好无损很多新手下载完直接就解压我建议多一步校验文件完整性。下载页面一般会提供SHA-256校验值可以用它来确认文件没损坏、没被篡改。# 下载源码包 cd /usr/local/src wget https://mirrors.aliyun.com/redis/redis-6.2.6.tar.gz # 计算SHA-256校验值 sha256sum redis-6.2.6.tar.gz然后去Redis官网找到redis-6.2.6对应的校验值对比一下。如果下载过程中网络中断导致文件损坏解压时会直接报错提前校验能省掉排查时间。3.3 解压和目录规划别乱装先想好装到哪解压很简单tar -zxvf redis-6.2.6.tar.gz解压后得到一个目录redis-6.2.6这就是源码目录。编译和安装是两个概念编译在源码目录里执行make生成可执行文件。安装把编译好的文件复制到系统指定路径比如/usr/local/redis。我习惯的目录规划是这样的/usr/local/src/redis-6.2.6/ # 源码目录编译完成之后其实可以删掉 /usr/local/redis/bin/ # Redis可执行文件 /usr/local/redis/etc/ # 配置文件 /usr/local/redis/logs/ # 日志文件 /usr/local/redis/data/ # 数据持久化目录这份规划不是强制标准但是目录清晰后面排查问题、做备份、迁移数据操作起来会舒服很多。很多老运维喜欢把所有东西扔到/usr/local/redis下面我觉得这个思路挺好的一目了然。4. 编译安装Redis 6.2.6完整流程4.1 安装依赖gcc编译器编译Redis需要gcc和make。如果系统里还没有先装上CentOS / RHEL 系统yum install -y gcc makeUbuntu / Debian 系统apt update apt install -y build-essentialbuild-essential这个包在Ubuntu里包含了gcc、make等一套编译工具非常省事。4.2 执行make编译命令和参数说明进入源码目录直接执行cd redis-6.2.6 make等编译完成。中间会产生大量输出正常现象。如果一切顺利最后会显示Hint: Its a good idea to run make test ;)然后执行安装make installmake install默认把Redis的二进制文件安装到/usr/local/bin目录下。如果你想指定前缀可以在编译阶段就带上# 编译时指定安装路径 make PREFIX/usr/local/redis install这样就会把生成的redis-server、redis-cli、redis-sentinel等可执行文件放到/usr/local/redis/bin下面。注意make PREFIX... install里的PREFIX一定要跟make放一起也就是在编译阶段就要用PREFIX指定。如果先直接make再执行make PREFIX/usr/local/redis install某些脚本的路径会不一致之后用的时候可能会出现奇怪的问题。这是我踩过坑之后总结出来的经验初次安装的人请务必记住。4.3 CentOS 7编译Redis 6.2.6的gcc版本坑我估计现在还有很多服务器是CentOS 7所以单独把这个问题拎出来说。CentOS 7自带的gcc版本是4.8.5而Redis 6.2.x在某些编译优化选项上跟这个老版本gcc有兼容问题。编译过程中可能报错最常见的错误是server.c: xx: undefined reference to __atomic_compare_exchange_8或者链接阶段报错。解决方案有几个方案一安装高版本gcc推荐使用软件集合SCL仓库安装高版本gccyum install -y centos-release-scl yum install -y devtoolset-8-gcc devtoolset-8-gcc-c scl enable devtoolset-8 bash执行完bash后当前shell的gcc就变成8.x了。然后再执行make。方案二只升级gcc不启用SCL如果你不想切换整个shell环境可以软链接新的gcc到/usr/local/bin下yum install -y centos-release-scl yum install -y devtoolset-8-gcc devtoolset-8-gcc-c ln -s /opt/rh/devtoolset-8/root/usr/bin/gcc /usr/local/bin/gcc ln -s /opt/rh/devtoolset-8/root/usr/bin/g /usr/local/bin/g然后新开一个终端让/usr/local/bin在PATH前面生效或者直接指定gcc路径make CC/opt/rh/devtoolset-8/root/usr/bin/gcc方案三关闭部分编译优化这套方案不太推荐只做应急用。直接在make时追加参数make CFLAGS-O1 -g降低优化级别可以绕开旧版gcc生成某些原子指令集的问题但Redis是一个对性能有极高要求的服务牺牲O2优化来编译实在不是明智之选。4.4 编译完成后验证可执行文件编译完成之后先看一下产出的二进制文件cd src ls -lh redis-server redis-cli标准输出应该类似-rwxr-xr-x 1 root root 6.6M ... redis-server -rwxr-xr-x 1 root root 3.4M ... redis-cli如果执行了make install用which redis-server确认安装路径。运行服务前的自检redis-server --version能看到类似输出Redis server v6.2.6 sha00000000:0 mallocjemalloc-5.1.0 bits64 build...这里能看到mallocjemalloc-5.1.0说明内存分配器用的是jemalloc这是Redis默认推荐的高性能内存分配器编译时如果你没特意指定它就会自动选jemalloc。5. 配置、启动和一键管理5.1 初始化目录和配置文件Redis跑起来之前需要准备好几个目录然后把配置文件放到位。如果你用的是make install默认全局安装二进制在/usr/local/bin如果用了PREFIX二进制在/usr/local/redis/bin。但配置文件默认不会装在系统里需要自己从源码目录里复制。假设我把Redis安装在/usr/local/redis配置文件也放这里mkdir -p /usr/local/redis/{bin,etc,logs,data} cp src/redis-server /usr/local/redis/bin/ cp src/redis-cli /usr/local/redis/bin/ cp src/redis-sentinel /usr/local/redis/bin/ cp redis.conf /usr/local/redis/etc/ ln -s /usr/local/redis/bin/redis-server /usr/local/bin/redis-server ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli这样做的逻辑很清晰Redis二进制、配置、日志、数据全部集中在/usr/local/redis这一个目录下而不是散落在系统各路径。之后做备份或者目录迁移非常省事。软链接让redis-server和redis-cli在全局可用shell里直接敲命令就能访问。5.2 修改redis.conf核心配置用文本编辑器打开redis.conf改动这几个关键项vim /usr/local/redis/etc/redis.confdaemonize是否以后台守护进程模式运行。自己手动管理服务建议设为yes不然前台跑着一关终端Redis就停了。daemonize yesdir持久化RDB和AOF文件的存放目录。改成刚才创建的data目录别用默认的当前目录不然启动时从别的路径一执行文件落得到处都是。dir /usr/local/redis/datalogfile日志文件路径。默认是空日志直接输出到标准输出。指定到logs目录方便排查问题。logfile /usr/local/redis/logs/redis.logbind监听的IP地址。默认127.0.0.1只有本机能访问。如果你需要在局域网内访问Redis改成具体IP或0.0.0.0。bind 0.0.0.0注意把bind改成0.0.0.0意味着所有网卡上的IP都能访问Redis。没有密码保护的话这就是在向全网裸奔。生产环境必须设置requirepass密码并且配合防火墙规则限制访问来源。requirepass设置访问密码。虽然Redis 6.x也支持ACL访问控制列表但最简单的入门方式还是设置密码。requirepass YourStrongPasswordmaxmemory最大内存使用上限。不设置的话Redis会一直占用内存直到系统崩溃。这个值需要根据业务实际情况来定。maxmemory 2gbmaxmemory-policy内存达到上限后的淘汰策略。常见的有allkeys-lru、volatile-lru、allkeys-random。缓存场景一般用allkeys-lru根据LRU算法淘汰最久没用的key。maxmemory-policy allkeys-lru5.3 前台启动和后台启动模式一前台启动适合第一次试运行在源码目录下cd /usr/local/redis ./bin/redis-server ./etc/redis.conf此时Redis在前台运行所有日志输出到当前终端或指定的logfile。优点是可以直接看到启动过程有没有报错。如果启动失败错误信息一目了然。模式二后台启动生产环境推荐redis.conf里已经设置了daemonize yes所以正常启动./bin/redis-server ./etc/redis.conf命令执行完就返回了Redis进程会在后台跑着。验证一下ps -ef | grep redis应该能看到类似信息root 12345 1 0 10:30 ? 00:00:01 ./bin/redis-server 0.0.0.0:63795.4 验证安装结果连接和基础操作Redis装好没有最主要的标准就是能不能正常连接、执行命令。用自带的客户端工具验证redis-cli -p 6379 ping如果你设置了密码需要加-a参数redis-cli -p 6379 -a YourStrongPassword ping正常会返回PONG。这就代表Redis服务已经跑起来了。再测试一下基本读写redis-cli -p 6379 -a YourStrongPassword set site abc redis-cli -p 6379 -a YourStrongPassword get site能返回abc说明读写功能正常这份安装过程基本就算成功了。提示在命令行直接带-a参数输入明文密码会留下历史记录这一点之前被很多人诟病。更安全的做法是使用REDISCLI_AUTH环境变量或者进入redis-cli交互模式后用AUTH命令认证。养成好习惯别把密码直接敲在命令行上。5.5 配置systemd服务实现开机自启生产环境的Redis不能每次服务器重启都手动去拉进程。配置成systemd服务再合适不过。创建一个systemd服务单元文件vim /etc/systemd/system/redis.service写入以下内容[Unit] DescriptionRedis 6.2.6 Server Afternetwork.target [Service] Typeforking ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf ExecStop/usr/local/redis/bin/redis-cli -p 6379 -a YourStrongPassword shutdown Restartalways RestartSec5 [Install] WantedBymulti-user.target几个关键点说明Typeforking因为redis.conf启用daemonize yesRedis自己会fork出后台进程所以用这个类型systemd会fork出主进程后认为服务启动成功。ExecStop通过redis-cli发送shutdown命令优雅关闭Redis让持久化数据安全落盘。RestartalwaysRedis进程意外崩溃时自动拉起减少业务中断时间。启动并设置开机自启systemctl daemon-reload systemctl start redis systemctl enable redis以后管理Redis就用systemctl status redis systemctl restart redis systemctl stop redis一整套服务管理方式就齐活了和系统自带的nginx、mysql服务的操作习惯保持一致。6. 常见问题与排查技巧实录6.1 编译报错gcc版本过低现象执行make时出现类似server.c: undefined reference to __atomic_compare_exchange_8的错误。原因CentOS 7等老系统自带gcc 4.8.5编译Redis 6.2.x时无法正确生成内建原子函数库的函数引用。解决升级gcc到8.x版本参考上面4.3节的方案一或方案二然后重新执行make。注意升级gcc后最好先执行make clean清理旧编译产物再重新make避免残留的中间文件干扰编译。6.2 启动报错无法打开日志文件现象启动Redis时提示Cant open the log file: No such file or directory原因redis.conf中配置了logfile /usr/local/redis/logs/redis.log但/usr/local/redis/logs/目录还没创建。解决先创建目录mkdir -p /usr/local/redis/logs然后再启动Redis。6.3 启动报错端口已被占用现象启动时提示Could not create server TCP listening socket *:6379: bind: Address already in use原因6379端口已经被另一个进程占用可能是之前已经启动了一个Redis实例也可能是别的程序占用了端口。排查netstat -tlnp | grep 6379 # 或者 lsof -i :6379看占用进程是Redis还是其他程序。如果是之前启动的Redis用它自己的shutdown命令关闭如果不是就需要修改当前Redis的端口配置。6.4 连接超时防火墙拦住了现象本地redis-cli能访问但远程服务器连接超时。原因最常见的两种情况Redis配置里bind还是127.0.0.1或者防火墙没放行6379端口。解决先确认bind配置然后放行防火墙端口CentOS 7 / 8firewall-cmd --permanent --add-port6379/tcp firewall-cmd --reloadUbuntuufw allow 6379/tcp6.5 数据持久化AOF和RDB怎么选既然已经安装好了顺便说一句数据持久化配置。redis.conf尾部有相关配置RDB快照模式默认开启save 900 1等规则表示“900秒内只要有一个key发生变化就保存一次快照”。适合对数据一致性要求不太高的缓存场景。AOF追加模式在文件里追加每个写操作命令默认关闭。开启方式appendonly yes appendfsync everyseceverysec每秒同步一次兼顾性能和数据安全。我的习惯是如果是生产环境两个都开让Redis在重启时优先用AOF恢复数据。AOF文件过大时可以执行BGREWRITEAOF手动重写压缩。6.6 性能验证安装结束后简单压测装完别急着直接上业务先做个简单的性能基准测试。Redis自带一个redis-benchmark工具redis-benchmark -h 127.0.0.1 -p 6379 -a YourStrongPassword -c 50 -n 100000 -t set,get参数说明-c 50是模拟50个并发连接-n 100000是每个命令执行10万次-t set,get表示测试SET和GET命令。跑完会输出类似SET: 92165.90 requests per second GET: 91324.00 requests per second单机单Redis轻松跑出9万的QPS这是正常水平。如果测出来数值特别低比如只有几千就要检查系统参数了——比如transparent_hugepage未关闭、系统最大文件数限制过低等这些内容展开又是单独一篇了。7. 其他安装方式容器和包管理的对比7.1 Docker方式安装Redis 6.2.6如果你的环境本身已经容器化Docker方式确实省事docker run -d --name redis-6.2.6 \ -p 6379:6379 \ -v /data/redis/conf:/usr/local/etc/redis \ -v /data/redis/data:/data \ redis:6.2.6 \ redis-server /usr/local/etc/redis/redis.conf优点很明显依赖隔离、环境干净、来回部署快一台机器想跑多个Redis实例也不冲突。缺点也很实际你要额外维护容器环境的稳定性数据卷权限、网络模式的选择、容器到宿主机文件系统IO的性能损耗都要考虑进去。如果业务对延迟极其敏感裸机部署还是首选。7.2 yum/apt包管理器安装包管理器安装是最快能在机器上跑一个Redis的方式# CentOS 8 之后的DNF dnf install redis # Ubuntu apt install redis-server方便是真方便但版本由软件源决定很可能装出来的版本和你期望的6.2.6不一致。比如某些系统的默认源里Redis版本还停在5.x那就跟需求不符了。另外包管理器安装的配置路径、启动方式都可能和官方源码版有所不同如果你是从官方文档学习配置项可能会有对不上的情况。7.3 安装方式对比表安装方式版本可控性部署速度生产环境适用度适合场景源码编译完全可控较慢高生产环境、对性能和环境有精细要求Docker完全可控快高容器化基础设施、多实例隔离包管理器取决于软件源最快中开发测试环境、快速搭建验证按我个人的经验生产环境的Redis实例我会倾向用源码编译方式虽然多花几分钟但是能把目录结构、版本、编译选项完全掌握。开发测试环境可以用包管理器或Docker怎么快怎么来。8. 写在最后再分享几个小细节我在部署Redis 6.2.6的过程中还有一些零碎的细节虽然不一定能写成专门的章节但对最终运行稳定性的影响不小。第一内核参数vm.overcommit_memory建议设置为1。Redis在做数据持久化时需要fork子进程写时复制会申请大量内存。如果系统内存overcommit策略严格有可能导致fork失败。设置方法sysctl -w vm.overcommit_memory1 echo vm.overcommit_memory1 /etc/sysctl.conf第二Linux的transparent_hugepage透明大页建议关掉。Redis官方特别提到过THP会导致Redis内存消耗增大和延迟抖动。关掉方式echo never /sys/kernel/mm/transparent_hugepage/enabled重启后还需要让这个设置保持可以写到/etc/rc.local里。第三加大文件描述符限制。Redis在运行时会打开很多连接如果系统默认的文件描述符上限太低连接数上来之后就会报错。在systemd服务文件里加上LimitNOFILE65535这几个小参数都是部署Redis后期发现问题后一点点摸索出来的。先用默认参数跑着一时半会儿看不出毛病等流量一上来各种问题就冒头了。建议在部署当天就把这些项都设置好别等到线上出问题了再补作业。如果你在安装过程中还有其他问题欢迎在留言区交流我会尽量回复。