
做后端的朋友应该都有体会项目交到你手上第一件事往往是先把基础环境理顺。Redis 6.2.7安装配置这件事看起来只是敲几条命令但在我接手过的不少项目里恰恰是环境这关最容易翻车。这篇文章我从版本选型开始把从下载、编译、配置到自启排查的完整过程都过一遍不讲虚的全程都是可以直接复制到服务器上执行的内容适合刚开始接触 Redis 的后端开发、运维以及准备在本地搭一套 Redis 环境练手的同学。1. 先聊版本为什么是6.2.71.1 6.2.x在Redis版本线里的位置Redis的版本演进大体上有几条线在并行推进。7.x系列引入了不少新特性比如函数、Sharded Pub/Sub、更好的集群支持6.2.x作为6.x版本线的最后一个稳定分支属于“承上启下”的维护版本。它既保留了6.0引入的ACL、多线程IO、RESP3这些现代化能力又比7.x更保守稳定性经过了大规模生产验证。我个人的看法是如果你的项目没有必须使用7.x新特性的需求选6.2.x是一个很稳的默认答案。很多云厂商的Redis实例、企业内部的基础镜像长期停留在6.2系列不是没原因的。它不像5.x那样老到缺功能也不像7.0初期那样需要额外关注升级兼容性卡在一个相当舒服的位置。具体到6.2.7这个小版本它是6.2系列中期的一个维护版本修复了此前版本里出现的一些稳定性问题和边界场景的Bug。我在实际部署中比较关注的是它对于ACL、复制、持久化等模块的修补这些都属于“不出问题没事一出问题头疼”的部分。所以选一个修得比较全的小版本省心。1.2 选型建议生产环境用新还是用旧这里我只说自己的选择逻辑。新项目如果团队对Redis比较熟可以直接上7.x如果是给老项目做环境迁移、或者团队没有专人维护基础组件6.2.7会是我优先考虑的版本。原因很简单文档多、踩坑记录多、网上随便一搜就能找到对应的解决方案。另外要注意Redis的小版本升级原则上是可以平滑替换的但不要在生产环境里为了追求“最新”就立刻跳到大版本。6.2.x到7.x有部分命令行为和配置项的变化比如部分命令语义调整最好先在测试环境跑一段时间。6.2.7这个版本我自己在多个环境部署过编译过程干净运行表现稳定这也是我在这篇文章里选择以它为例的原因。经验不要盲目追新也不要固守老版本。6.2.7适合大多数常规业务如果对Stream、Function等新特性有需求再考虑7.x。2. 安装前准备环境、依赖与下载2.1 确认操作系统和编译工具链Redis从源码编译安装本质上依赖操作系统的编译工具链。绝大多数Linux发行版都自带gcc和make但版本可能比较老。Redis 6.2.x要求编译器支持C11标准一般gcc 5以上都没问题。CentOS 7自带的gcc 4.8.5就不行需要先升级或者用devtoolsetUbuntu 20.04、Debian 10以上的默认gcc版本足够。安装前建议先看一眼环境cat /etc/os-release gcc --version make --version如果gcc版本偏低在Ubuntu/Debian上执行sudo apt update sudo apt install -y build-essentialCentOS/RHEL上sudo yum install -y gcc make另一个容易被忽略的依赖是pkg-config。编译Redis的TLS支持时需要它来定位OpenSSL库即使不开启TLS装上也保险。还要注意编译时如果缺少libc-dev在基于Alpine的容器里会报错得先跑一句apk add build-base。2.2 下载Redis 6.2.7源码包Redis官方源码包托管在download.redis.io和GitHub上。我的习惯是先通过下载页确认版本号再直接wget固定地址。6.2.7的包名是redis-6.2.7.tar.gz大小在2MB多下载很快。cd /opt wget https://download.redis.io/releases/redis-6.2.7.tar.gz如果你处于内网环境可以在本地下载好再传到服务器上或者在内网搭一个软件源。源码包很小不需要担心传输成本。下载后建议校验一下sha256避免下载损坏。虽然从官方源下载出问题的概率很低但这是个好习惯。sha256sum redis-6.2.7.tar.gz解压之后进入目录tar xzf redis-6.2.7.tar.gz cd redis-6.2.72.3 离线环境安装怎么做离线服务器安装Redis是运维经常遇到的场景。如果服务器完全无法访问外网你需要在一台能联网的机器上准备好源码包和依赖然后拷贝过去。离线安装的核心是解决依赖问题。Redis本身依赖很少编译只需要gcc、make、libc。如果目标机器连gcc都没有可以下载对应的rpm/deb包或者使用Docker镜像直接跑redis-server。我遇到过不少客户现场是内网机器没有编译工具链最省事的方式是用静态编译的Redis二进制或者用Docker跑官方镜像docker run -d --name redis -p 6379:6379 redis:6.2.7这种方式不需要在宿主机安装任何编译工具只要目标机器上有Docker环境即可。需要注意容器方式跑Redis数据卷一定要挂载出来不然容器一删数据就没了。3. Linux环境下的编译安装全流程3.1 解压与编译make命令背后的逻辑进入源码目录后直接执行make就能开始编译。Redis的Makefile会把src目录下的源码编译成可执行文件默认使用MALLOCjemalloc因为Redis在内存管理上对jemalloc做了优化性能更好、碎片更少。make -j4-j4是并行编译数量根据CPU核数调整。如果编译过程中报错提示找不到jemalloc可以改用make MALLOClibc。这个错误通常发生在系统缺少jemalloc依赖或者版本不兼容的情况下。改用libc内存分配器对功能没有影响只是在高负载场景下内存碎片率的表现可能不如jemalloc。编译时间一般在1到3分钟取决于机器性能。编译完成后src目录下会生成redis-server、redis-cli、redis-check-aof、redis-check-rdb、redis-benchmark等可执行文件。3.2 安装到指定目录make install PREFIX默认安装会让可执行文件散落在/usr/local/bin下管理起来不太方便。我更习惯指定一个独立的安装目录比如/usr/local/redis把所有Redis相关文件集中到一起make install PREFIX/usr/local/redis执行后可执行文件会安装到/usr/local/redis/bin目录下。接下来需要手动创建配置目录并把源码包里的配置模板复制过去mkdir -p /usr/local/redis/conf cp redis.conf /usr/local/redis/conf/这样做的好处是以后想要清理Redis环境直接删掉/usr/local/redis目录就干净了不会污染系统的其他路径。对于需要同时部署多个版本做对比的场景这种按目录隔离的方式也特别有用。3.3 编译期常见报错与修复编译Redis最常见的报错无非这几种gcc版本太老、缺少依赖、jemalloc编译失败。逐个说下我实际遇到的情况。gcc版本太老报错信息通常是cc1: error: unrecognized command line option -stdc11。解决办法是升级gcc工具链Ubuntu/Debian用apt install build-essentialCentOS 7用yum install devtoolset-7并启用对应的环境变量。缺少tcl执行make test时会提示找不到tclsh这不影响编译只是不能跑官方测试。想跑测试的话装一下tcl即可sudo apt install -y tcljemalloc编译失败报错信息会指向jemalloc相关文件。解决方式有两种一是安装系统自带的jemalloc开发包二是直接用libc版本make MALLOClibc我个人的经验是如果不追求极致性能MALLOClibc完全够用很多云厂商的镜像甚至默认就是libc。别在这上面卡太久。3.4 验证安装成果编译安装完成后先验证一下版本和服务端是否能正常启动/usr/local/redis/bin/redis-server --version输出应该包含v6.2.7。再用前台模式启动一次确认没有报错/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf如果配置里没改过daemonizeRedis会以前台方式运行终端里会打印启动日志。看到Ready to accept connections这行日志说明服务已经跑起来了。按CtrlC停掉再往下做配置和进程管理。4. Windows下的安装与配置方案4.1 官方不支持Windows怎么办很多初学者在Windows上接触Redis第一反应是去官网下载Windows安装包但会发现官方并没有提供Windows版本。Redis官方文档明确表示不支持Windows这导致Windows下没有“官方红帽”式的安装包。实际可行的方案有三类WSLWindows Subsystem for Linux、第三方移植版、Docker Desktop。先说结论我推荐有条件的同学优先用WSL因为它跑的是Linux原版Redis行为和生产环境完全一致不会出现“本地能跑、Linux上不行”的诡异问题。WSL的安装过程不展开细说装好之后在WSL里执行Linux的编译安装步骤即可。这种方式最接近真实环境和学习Redis本身的目标最匹配。4.2 第三方移植版本的使用体验如果一定要在Windows原生环境里跑比较知名的是tporadowski/redis这个开源项目它是基于Redis 5.0.x移植的。注意它的版本号停留在5.x不是6.2.7。这意味着你没法在Windows上获得与Linux完全一致的6.2.7体验有些命令和配置行为会不一样。另一个选择是Memurai它兼容Redis的API可以作为Redis的Windows替代品支持Redis 7的不少特性但它是商业产品免费版有一定限制。我的建议是除非项目强制要求Windows原生运行否则不要用移植版。原因很直接Redis官方的新特性、稳定性和安全修复都不会同步到这些第三方项目上出问题排查起来也难。4.3 Redis客户端可视化工具体验不管Windows还是Linux环境日常开发中我们都会用到Redis客户端工具。第一代Redis Desktop ManagerRDM是最早流行的可视化客户端后来官方将重心转向了Redis InsightRDM的维护跟不太上。现在还有一个很多人在用的开源工具叫Another Redis Desktop Manager界面风格类似但不是同一个项目。连接Redis时这些工具大同小异主要是填IP、端口、密码。我这里强调一点如果Redis不在本机连接前一定要先确认redis.conf里bind允许了对应网卡地址protected-mode也有影响不然客户端工具大概率会报连接超时或拒绝连接。5. redis.conf核心配置逐项解读5.1 守护进程与端口绑定配置安装目录下复制出来的redis.conf是官方模板里面每一项都有详细注释,但直接跑的话很多配置不满足实际使用需求。先看几个最基础也是最重要的。daemonize默认是no即前台模式运行。如果直接在生产环境这么跑关闭终端服务就停了所以我通常改成yesdaemonize yesport默认6379如无特殊要求保持默认。如果服务器上需要同时跑多个Redis实例可以把端口区分开比如6380、6381。bind默认配置里是127.0.0.1 -::1只允许本机访问。如果想让局域网内其他机器连接需要把本机IP加进去。这里一定注意不要直接改成0.0.0.0加裸奔模式风险很大。后面第7章我会再展开这个坑。5.2 安全配置requirepass和protected-modeRedis默认是不需要密码的这在新装环境里是个隐患。一旦服务绑定了非本机地址任何人都可以直接访问你的Redis改写数据甚至写入计划任务反弹Shell都是可能的。所以设置密码是必须的。在redis.conf里找到requirepass取消注释并设置强密码requirepass your-strong-password设置密码后redis-cli连接时需要用-a参数或者在交互模式里执行AUTH命令。protected-mode这个参数默认是yes意思是如果Redis没有设置密码并且没有显式配置bind那么只接受本机回环地址的连接。这是一个保护机制不建议关闭。正确地做法是设置好密码再把bind配成内网IP。注意protected-mode的默认保护逻辑是“没密码没bind”时才生效。如果你手动设了bind 0.0.0.0但忘了加密码系统不会拦你这时候Redis就完全暴露了。5.3 持久化配置RDB和AOF怎么选Redis有两个持久化机制RDB快照和AOF日志。RDB是定期把内存数据全量保存到磁盘文件紧凑、恢复快但数据可能丢失最后一次快照之后的更新。AOF则像日志把每次写命令追加到文件里数据丢失窗口更小但文件体积增长大。我的常规配置是两者同时开启RDB用于备份和快速恢复AOF用于崩溃时尽可能减少数据丢失。在redis.conf中重点看这几项save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysecsave 900 1表示900秒内至少有1次写操作就触发一次RDB快照。后面的300 10和60 10000同理。生产环境可以根据写入频率调整不需要极端的每秒钟都写一次。appendfsync everysec是AOF刷盘策略每秒钟刷一次兼顾性能和数据安全。除非业务对数据丢失零容忍否则不建议用always它会让每个写命令都等磁盘IO完成性能下降明显。5.4 内存管理与淘汰策略Redis是内存数据库内存满了以后怎么办这取决于maxmemory和maxmemory-policy。默认这两个都没配置意味着Redis可以一直把内存用到底直到操作系统OOM把你杀掉。生产环境绝对不能这么干。我的习惯是设置一个比物理内存略低的值比如服务器内存8GRedis分配4G防止其他进程挤在一起时触发系统OOMmaxmemory 4gb淘汰策略有几个常见选择noeviction写命令直接报错不淘汰任何key适合不允许丢数据的场景。allkeys-lru从所有key里按LRU淘汰适合缓存场景。volatile-lru只对设置了过期时间的key做LRU淘汰适合混合业务。我的实践里缓存服务用allkeys-lru业务数据库场景用noeviction避免Redis默默把数据丢了导致上层业务逻辑出错。5.5 慢日志与监控配置排查Redis问题时慢日志是特别有用的工具。默认情况下Redis会记录执行时间超过slowlog-log-slower-than的命令单位是微秒。slowlog-log-slower-than 10000 slowlog-max-len 128这里10000就是10毫秒。对于绝大多数业务超过10毫秒的Redis命令都值得关注。查看慢日志的方式redis-cli SLOWLOG GET 10另外日志文件路径也建议显式配置logfile /usr/local/redis/logs/redis.log日志目录要提前创建好否则Redis启动时发现目录不存在只会把错误打到你脸上。6. 启动、自启与基础验证6.1 前台与后台启动方式配置好daemonize yes后再次启动Redis它会自动进入后台运行/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf启动后检查进程是否存在ps -ef | grep redis-server看到类似redis-server 127.0.0.1:6379的输出说明启动成功。如果启动失败先查看日志文件绝大多数情况下日志里已经把原因写得很清楚。6.2 systemd管理Redis服务生产环境里我更推荐使用systemd来管理Redis这样能实现开机自启、异常自动重启。在/etc/systemd/system/redis.service下新建一个服务文件[Unit] DescriptionRedis 6.2.7 Server Afternetwork.target [Service] ExecStart/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecStop/usr/local/redis/bin/redis-cli -p 6379 shutdown Restartalways Userredis Groupredis [Install] WantedBymulti-user.target这里指定了Userredis所以最好创建一个专用的系统用户来跑Redis不要用rootuseradd -s /sbin/nologin redis chown -R redis:redis /usr/local/redis创建好之后重新加载systemd配置并启动服务systemctl daemon-reload systemctl start redis systemctl enable redisenable是设置开机自启的关键命令。以后管理Redis就用systemctl status redis、systemctl restart redis这些命令和系统服务保持一致习惯。6.3 redis-cli基础命令验证服务启动后用redis-cli验证连通性。带密码的情况下/usr/local/redis/bin/redis-cli -a your-strong-password ping如果看到PONG说明服务正常。接着可以写入一条数据再读取/usr/local/redis/bin/redis-cli -a your-strong-password set hello world /usr/local/redis/bin/redis-cli -a your-strong-password get hello返回值是world说明读写流程全通。这里建议生产环境不要直接在命令行里带-a密码因为会留在shell历史记录里。可以用REDISCLI_AUTH环境变量或者在交互式shell里执行命令再手动输入密码。6.4 配置开机自启的另一种方式如果你所在的系统没有systemd比如用SysV init的老版本CentOS也可以在/etc/rc.local里追加启动命令。这种方式比较粗暴但对老系统有效echo /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf /etc/rc.local chmod x /etc/rc.local注意rc.local里的命令是以root身份执行的最好结合su切换到redis用户来跑。能用systemd的场景优先用systemd。7. 常见问题与排查技巧实录7.1 连接拒绝bind和protected-mode的坑客户端连不上Redis最常见的报错是Connection refused。这时候先确认三件事Redis进程是否在跑、端口是否监听、网络是否通。ps -ef | grep redis ss -lntp | grep 6379如果进程在跑端口也有监听但跨机器访问仍然拒绝罪魁祸首通常就是bind配置。默认情况下Redis只监听127.0.0.1其他机器自然连不上。修改方案是把本机内网IP追加到bind后面bind 127.0.0.1 192.168.1.100不要简单地把bind删掉或者改成0.0.0.0除非你很清楚自己在做什么。protected-mode yes时如果设置了密码相当于对外也加了一道门禁。我最推荐的安全组合是bind指定内网IP requirepass强密码 protected-mode yes。7.2 认证失败和密码相关排查连接时报NOAUTH Authentication required说明服务端开启了密码验证而客户端没有提供密码。解决办法很简单redis-cli AUTH your-strong-password如果报ERR Client sent AUTH, but no password is set说明你给客户端加了密码参数但服务端根本没配requirepass。去掉客户端密码参数或者在配置文件里加上密码即可。还有一个小坑密码包含特殊字符时命令行里的引号要处理好否则shell会截断。我建议密码只用大小写字母加数字避免不必要的麻烦。7.3 内存与持久化问题排查内存方面如果Redis运行一段时间后内存占用明显高于maxmemory先确认是不是maxmemory没生效或者配置值本身不合理。通过redis-cli INFO memory可以看到used_memory、used_memory_human、maxmemory等指标。持久化方面AOF文件越来越大是一个常见问题。Redis 6.2支持AOF重写机制会通过BGREWRITEAOF子进程把小日志合并成完整快照。如果AOF增长飞快除了检查业务写入模式还要确认auto-aof-rewrite-percentage和auto-aof-rewrite-min-size的设置auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb这个配置的意思是当AOF文件大小超过上次重写后的一倍并且体积大于64MB时触发自动重写。7.4 性能排查的几个实用命令Redis自带几个性能排查工具下面这些我经常用。redis-benchmark用来压测基础性能/usr/local/redis/bin/redis-benchmark -h 127.0.0.1 -p 6379 -a your-strong-password -c 50 -n 100000INFO stats可以看每秒操作数instantaneous_ops_per_sec判断当前实例负载。SLOWLOG GET命令前面提过是排查慢命令的第一选择。找到慢命令后分析它的大key、复杂操作或者考虑在业务层做缓存优化。排查慢命令时重点关注KEYS、HGETALL、SMEMBERS、ZRANGEBYSCORE这类O(N)命令它们在高并发下最容易成为瓶颈。7.5 使用场景扩展从单机到主从安装配置完成后如果你只有一个实例很多能力其实没有发挥出来。最常见的扩展是搭主从复制。主从架构能解决单点故障读多写少的业务还能用从库分担读压力。在主从配置中从库的redis.conf里加一行replicaof 192.168.1.100 6379然后启动从库它会自动从主库同步数据。可以通过INFO replication查看主从状态。如果主库设置了requirepass从库还要配置masterauthmasterauth your-strong-password主从复制本身的原理是异步的主库写成功后立刻返回从库异步拉取。所以如果业务要求强一致读不能依赖从库的数据。8. 安装配置之外几个值得养成的习惯8.1 用systemd管理之前先手动跑一遍我一向的建议是新装环境不要急着配systemd服务先在命令行手动启动Redis用redis-cli把基本读写命令验证完再做成服务。这样能避免systemd、权限、路径这些因素干扰Redis本身的排错。如果Redis直接以服务方式启动失败定位起来反而不方便。手动验证通过后再切换到systemd管理。这中间要注意目录权限Redis运行用户对数据目录、日志目录、配置文件需要可读可写。8.2 配置文件的备份与版本管理我在每个环境部署完Redis都会把配置文件和部署命令记录下来放到项目的Git仓库里。这个习惯帮我省了很多事换一台新服务器时直接按文档配置不用重新摸索团队其他人也能照着做不会出现“只有我知道怎么部署”的情况。redis.conf本身就支持include指令可以把不同的配置拆分成多个文件比如redis-base.conf放公共配置redis-6379.conf放实例相关的端口、日志路径可读性更好。8.3 从安装配置到系统监控的最后一公里服务跑起来只是第一步我通常会在安装完Redis后顺手做一件事配置监控。最简单的方式是定期执行INFO命令并把关键指标采集到监控系统比如connected_clients、used_memory、evicted_keys、rejected_connections、sync_full这些。不用等出问题再去查先被监控报警通知到定位时间会短很多。如果不想引入额外的监控组件可以先写个简单的cron脚本每5分钟执行一次redis-cli INFO并把结果重定向到日志文件配合日志轮转也能满足基本的“事后追溯”需求。踩过几次坑之后我的体会是Redis安装配置看着简单但真要跑得稳版本选型、安全配置、持久化策略、进程管理缺一不可。每次部署都按这四件事过一遍很少会再出环境问题。最后再分享一个小技巧redis-cli shutdown这个命令比直接kill进程优雅得多。它会先触发一次持久化保存再安全停机减少数据丢失的概率。配了systemd之后执行systemctl stop redis也会走这个流程。我现在每次部署新环境都习惯把这条命令写在文档的最显眼位置这个习惯帮团队避免过不少次数据回滚的麻烦。