ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Redis 6.2.6安装实战:Linux与Windows完整指南

Redis 6.2.6安装实战:Linux与Windows完整指南 很多朋友第一次用 Redis最容易卡住的不是写代码而是第一步怎么把这东西装起来、跑起来。网上搜 Redis 下载安装出来的教程要么版本老旧要么只讲 Linux 不讲 Windows跟着做一步错一步特别劝退。这篇就专门聊 Redis 6.2.6 在 Linux 和 Windows 两边的完整安装实操我会把我实际部署时踩过的坑、验证过的命令、改过的配置全部直接写出来你可以当一份“照着抄就能跑”的笔记用。这篇内容适合这几类人刚学 Redis 想在自己机器上搭个环境的初学者需要在服务器上快速部署 Redis 做缓存、会话存储的开发者以及准备面试想自己动手把 Redis 跑一遍加深理解的求职者。读完之后你不光能装起来还会知道装完第一件事该做什么、出了问题去哪查。1. 版本选择和下载前的准备1.1 为什么挑 6.2.6 这个版本先说说版本选择。Redis 的版本迭代很快新特性一个接一个但选版本不是越新越好。6.2.x 是 Redis 6.2 系列的稳定分支6.2.6 是其中的一个重要补丁版本修复了之前版本里的一些 bug 和安全问题同时又没有像 7.x 那样引入太多新的配置项和行为变化。对于生产环境来说6.2.6 是一个非常稳的选择。具体到特性上6.2 这一代有几个很实用的能力RESP3 协议相比老旧的 RESP2支持了更丰富的数据类型返回比如HELLO命令客户端可以主动切换协议版本。ACL 访问控制这个在 6.0 引入6.2 里更成熟了可以给不同用户分配不同命令和 key 的权限安全性比老版本全靠一个requirepass强太多。客户端缓存服务端可以推送 key 失效通知给客户端相当于给 Redis 做了一层“本地缓存 失效同步”的机制对高并发读取场景帮助很大。多线程 IO虽然 Redis 的核心命令执行还是单线程但网络 IO 读写已经可以配置多线程了在一定程度上缓解了高并发下的网络瓶颈。选择 6.2.6 而不是更老的 5.x 或 4.x除了性能和特性差异还有个现实原因很多中间件、云服务和面试题默认讨论的就是 6.x 的生态。装一个版本太老的后面学 ACL、学 RESP3 都没法实操还得重新折腾升级。1.2 官方下载源和镜像选择Redis 的官方下载地址是 redis.io官网会列出最新稳定版但历史版本需要去 GitHub Releases 页面找或者直接拼 URL。6.2.6 对应的源码包名称是redis-6.2.6.tar.gz。下载时有几个选择源码包官方只发布源码包需要在服务器上编译安装这是最推荐的生产环境装法后面细讲。Docker 镜像如果只是本地开发测试或者环境本来就容器化直接拉镜像最快但前提是你熟悉 Docker 基本操作。Windows 移植版官方不支持 Windows但社区有一些移植版本可用适合本地调试跑跑看生产环境不建议用。有一个非常实用的经验如果你在国内服务器上下载 GitHub 上的 release 包速度经常惨不忍睹。这时候不用干等直接改到国内镜像源下载或者用wget加代理一般都能把速度拉起来。不过要注意不管从哪下载拿到文件后都要核对一下文件大小和校验值防止下载不完整或者被篡改过。具体下载方式后面按操作系统分开讲这里先记住一个核心结论Redis 不挑机器只要能跑 Linux 或者装个 WSL就能把官方源码完整跑起来。接下来这一节就是重头戏Linux 下的完整安装流程。2. Linux 下从源码编译安装 Redis 6.2.62.1 安装前必须准备的依赖在开始编译之前先确认系统里有没有装好编译工具链。Redis 是用 C 语言写的编译需要gcc和make这两个缺一不可。在 CentOS、Ubuntu、Debian 这些主流发行版上安装命令不太一样# Ubuntu / Debian sudo apt update sudo apt install -y build-essential tcl pkg-config # CentOS / RHEL sudo yum install -y gcc make tcl这里有个非常容易踩的坑——CentOS 7 自带的 gcc 版本是 4.8.5这个版本太老了编译 Redis 6.2.6 时会直接报错错误信息类似you need tcl 8.5 or newer in order to run the Redis test或者干脆是一堆编译报错。解决办法有两种升级 gcc用sudo yum install -y centos-release-scl装软件集合然后sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c再用scl enable devtoolset-9 bash切换到新版本。直接用 Docker 镜像如果只是测试拉一个centos:7容器然后装高版本 gcc省时省力。我在生产环境遇到过一次 gcc 版本问题当时排查了很久一直以为代码有问题后来用gcc --version一看才发现是编译器太老。所以装依赖前一定记得先跑一下gcc --version确认版本号5.x 以下基本没戏。2.2 编译安装的完整命令和参数依赖准备齐全后正式开工。建议把 Redis 的源码放在/usr/local/src下编译完成后安装到/usr/local/redis这样目录清晰日后找配置文件和日志都方便。# 下载源码包 cd /usr/local/src wget https://download.redis.io/releases/redis-6.2.6.tar.gz # 解压 tar xzf redis-6.2.6.tar.gz cd redis-6.2.6 # 编译 make -j$(nproc) # 运行测试强烈建议执行能发现大部分编译问题 make test # 安装到指定目录 make PREFIX/usr/local/redis installmake install这一步很有意思它做的事其实很简单把编译出来的几个可执行文件复制到指定目录下。装完后/usr/local/redis/bin下会有这些工具redis-server服务端主程序启动 Redis 就靠它。redis-cli命令行客户端用来连接和操作 Redis也是排查问题最趁手的工具。redis-sentinel哨兵进程做高可用时用到。redis-check-aof/redis-check-rdbAOF 和 RDB 持久化文件的修复检查工具Redis 非正常关机后这两个工具能救命。redis-benchmark压测工具可以简单测一下当前机器跑 Redis 的性能。编译时有两个参数需要额外说明-j$(nproc)-j指定并行编译的进程数$(nproc)会自动获取 CPU 核心数加快编译速度。编译 Redis 本来就快几十秒到一两分钟搞定但加了确实更快。make test很多人跳过这步我不建议。它不光是验证编译结果还能早一步发现内存分配、系统参数方面的问题。比如出现malloc相关的报错往往就是 jemalloc 在某些环境下的兼容性问题好过你启动后再抓瞎。2.3 编译报错 jemalloc 和 gcc 版本问题的处理编译 Redis 最容易遇到的报错有两个我每次帮别人排查几乎都能碰到。第一个是编译时报jemalloc.h: No such file or directory。这个问题的本质是 Redis 默认使用 jemalloc 作为内存分配器但部分系统里 jemalloc 的编译或检测会失败。解决办法有两种# 方案一明确使用 libc 自带的 malloc make MALLOClibc # 方案二先清理再重编 make distclean make MALLOClibc -j$(nproc)MALLOClibc表示用系统自带的 malloc 替代 jemalloc性能上差距不大尤其是在测试环境。生产环境如果你确实想用 jemalloc可以提前通过系统包管理器安装 libjemalloc-dev 或 jemalloc-devel再重新编译。第二个是前面提到的 gcc 版本过旧报错信息可能千奇百怪但核心原因就一个编译器不支持新语法或新特性。遇到这种情况别怀疑代码先升级 gcc。用 4.8.5 编译 6.2.6基本没有成功的可能这是我亲自踩过的坑。还有一个小细节编译完成后源码目录里会生成一个src/redis-server可执行文件。如果你不想执行make install直接把这个文件拷走也能用但不建议这么干因为没有配套的redis-cli和其他工具后续排查问题不方便。2.4 启动 Redis 并验证服务状态安装完成后可以先用最简单的命令把 Redis 启动起来试试# 前台启动能看到全部日志 /usr/local/redis/bin/redis-server # 或者指定配置文件启动推荐 /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf如果直接裸启动Redis 会以默认配置运行监听6379端口。然后用redis-cli验证/usr/local/redis/bin/redis-cli ping如果返回PONG说明服务和客户端都正常。这一步看到PONG心里就有底了后面的一切配置调优都建立在“服务能跑”这个前提之上。不过直接用默认配置启动只是权宜之计那只是前台启动窗口一关就没了而且默认配置没有任何性能优化。生产环境必须用配置文件后台运行并对一些关键参数做调整。这就是下一节的内容。3. Windows 下安装 Redis 的实际可用方案3.1 官方不支持 Windows但你有三个选择Redis 官方从来没有发布过 Windows 版本。很多人不知道这点从各种乱七八糟的“Redis 官网”下载到一个 exe 安装包双击安装后不是报错就是捆绑了一堆垃圾软件。真相是Redis 在 Windows 上有三种相对靠谱的获取方式使用 WSLWindows Subsystem for Linux这是微软官方支持的 Linux 子系统在 Windows 里跑一个真正的 Linux 环境然后在里面编译安装 Redis。这是最接近官方支持的方案也是我强烈推荐的做法。使用 Docker Desktop装好 Docker Desktop 后直接拉取redis:6.2.6镜像启动。前提是电脑支持虚拟化并且装好 WSL2 后端。使用社区移植版GitHub 上有一些 Windows 社区的 Redis 移植项目比如 tporadowski/redis 维护的 5.x 版本以及后来的其他分支。这类版本可以直接运行 exe适合快速验证但版本滞后而且官方不背书生产环境绝对别用。3.2 WSL 2 里的完整安装演示如果你用的是 Windows 10/11最省心的方案是先把 WSL 2 装好。在 PowerShell管理员权限里执行wsl --install这个命令会默认安装 Ubuntu并且自动配置 WSL2。装完重启进入 Ubuntu 终端后面的操作就和 Linux 一节完全一样只需要注意目录挂载路径Windows 的 C 盘在 WSL 里是/mnt/c/源码包可以直接放到/mnt/c/temp下两边共享。我在 Windows 上实测过WSL2 里编译 Redis 6.2.6 的速度和原生 Linux 相差无几而且和 IDE、命令行工具的配合很好。唯一要注意的是 WSL2 的网络模式和宿主机不太一样Windows 宿主机访问 WSL2 里的 Redis需要知道 WSL2 的 IP或者做端口转发这个我们后面讲连接工具时细说。3.3 Docker 方式的快速启动如果你电脑上已经装好了 Docker Desktop那用 Docker 跑 Redis 可能是最快的路径# 拉取 6.2.6 镜像 docker pull redis:6.2.6 # 启动容器映射端口 docker run -d --name redis626 -p 6379:6379 redis:6.2.6 # 进入容器执行 redis-cli docker exec -it redis626 redis-cli ping这里有个地方容易踩坑如果你之前启动过redis:latest镜像本地可能已经缓存了 7.x 版本的镜像直接指定redis:6.2.6时会重新拉取网络不好会等一阵子。另外容器里的 Redis 默认也不读取外部配置文件想用自定义配置需要挂载配置文件docker run -d --name redis626 -p 6379:6379 -v /path/to/redis.conf:/usr/local/etc/redis/redis.conf redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf文件挂载之前务必确认宿主机上的配置文件路径是绝对路径而且文件权限没问题否则容器起不来。3.4 Windows 本地可视化连接工具装好 Redis 服务端后Windows 上还得有一个趁手的连接工具。命令行当然能用但可视化工具看 key、看内存占用、看命令执行都要直观得多。常见的几款工具我简单做个对比工具名称是否免费适合场景备注RedisInsight免费官方出品支持 Redis 6.x 新特性可视化能力强首推功能最全Another Redis Desktop Manager免费轻量、界面简洁、启动快适合日常开发和快速查看Redis Desktop Manager有免费版高级功能收费老牌软件文档多旧版本对 RESP3 支持一般命令行 redis-cli免费排查问题、写脚本、精确操作一切工具的基础必须会使用可视化工具连接时如果 Redis 跑在 WSL2 里宿主机不能直接连localhost:6379需要先查一下 WSL2 的 IP。在 WSL2 终端里执行ip addr show eth0 | grep inet拿到类似172.22.x.x的地址后可视化工具里 host 填这个 IP。如果你嫌每次找 IP 麻烦可以用 Windows 的端口转发netsh interface portproxy add v4tov4 listenport6379 listenaddress127.0.0.1 connectport6379 connectaddressWSL2 IP然后在连接工具里就直接填127.0.0.1:6379。这个命令我建议记下来很多 WSL2 跑服务的场景都能用上。4. 安装后的基础配置和自启动方案4.1 redis.conf 里最值得改的几个参数Redis 启动时如果不指定配置文件用的是内置的默认配置默认配置适合本地测试不适合任何正经环境。安装包自带的redis.conf就在源码目录下我们需要把它复制到安装目录然后逐项调整。mkdir -p /usr/local/redis/conf cp /usr/local/src/redis-6.2.6/redis.conf /usr/local/redis/conf/redis.conf接下来打开redis.conf重点关注这几个参数# 后台运行不要默认前台 daemonize yes # 监听地址默认只允许本机连接改成 0.0.0.0 允许外部访问注意防火墙 bind 0.0.0.0 # 保护模式开启后没有密码且绑定公网地址时会拒绝外部连接 protected-mode yes # 密码生产环境必须要设 requirepass YourStrongPassword # 日志级别和路径 loglevel notice logfile /usr/local/redis/logs/redis.log # 持久化目录 dir /usr/local/redis/data # RDB 持久化策略 save 900 1 save 300 10 save 60 10000 # AOF 持久化 appendonly yes appendfsync everysec # 最大内存限制按实际可用内存设置 maxmemory 2gb maxmemory-policy allkeys-lru为什么bind和protected-mode要放在一起说因为这两个参数和密码之间有很强的联动关系。如果bind设成0.0.0.0protected-mode又是默认的 yes那 Redis 只允许没有密码的本机连接外部访问会被直接拒绝这是 Redis 主动加的一道安全防线。所以如果你想从别的机器连接要么设了密码要么关闭保护模式两者必居其一。我建议保留保护模式同时设置强密码不要为了省事关闭保护。maxmemory这里我给个建议值不要超过物理内存的 60%-70%同时留出一部分给操作系统。比如机器有 4G 内存设置 2.5G 比较稳。如果把maxmemory设得比物理内存还大触发了allkeys-lru的淘汰策略后一旦内存不够前面写入的数据会被悄悄淘汰出现“写进去了但查不到”的诡异问题排查起来很头疼。4.2 Redis 密码登录和 ACL 权限配置密码是 Redis 安全的基础。用requirepass设置的是默认用户的密码所有连接都必须带这个密码才能执行命令。配置文件里改完要重启服务或者直接在命令行里用CONFIG SET requirepass临时动态修改不用重启。但注意动态修改不会写进配置文件重启后恢复原样所以正式环境还是配置文件为主。除了密码6.2 的 ACL 特性可以做得更细。比如创建一个只允许操作cache:前缀 key 的用户# 创建用户带密码只允许访问 cache: 前缀的键 ACL SETUSER appuser on AppUserPassword ~cache:* read write # 验证 ACL LISTACL 的好处是即使密码泄露攻击者的操作范围也被严格限制无法影响其他业务的 key。这在多人共用一套 Redis 的环境里特别实用。我见过不少团队一套 Redis 里好几个项目混用默认用户密码大家共享一个项目出问题其他项目全部遭殃后来就是用 ACL 拆开的各自独立用户互不影响。4.3 配置 systemd 开机自启动在 Linux 生产环境Redis 不能靠手动redis-server启动一旦服务器重启就傻了。SysV 的 Init 脚本方式比较老了现在主流是 systemd直接写一个 service 单元文件。在/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/conf/redis.conf ExecStop/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown Restartalways Userredis Groupredis [Install] WantedBymulti-user.target注意Typeforking和配置里的daemonize yes是配套的Redis 自己 fork 到后台systemd 才认为启动完成。如果你把daemonize改成 no那Type要改成simple否则 systemd 会认为服务启动失败。要想跑得更稳建议单独创建一个系统用户来运行 Redis。权限最小化原则在数据库服务上尤其重要不要让 Redis 跑在 root 下万一被攻击整个服务器都危险。useradd -r -s /bin/false redis mkdir -p /usr/local/redis/logs /usr/local/redis/data chown -R redis:redis /usr/local/redis最后重载 systemd 并启动systemctl daemon-reload systemctl enable redis systemctl start redis systemctl status redis看到active (running)并且redis-cli ping返回 PONG这套 Redis 就算立住了。5. 快速验证安装结果和踩坑记录5.1 用 redis-cli 做一轮功能自检装完 Redis 之后别急着写业务代码先用redis-cli把核心功能跑一遍确保服务真的可用。这一步花不了两分钟但能帮你提前发现很多配置问题。# 带密码登录 /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a YourStrongPassword # 验证连接 127.0.0.1:6379 auth YourStrongPassword OK 127.0.0.1:6379 ping PONG # 简单读写 127.0.0.1:6379 set hello world OK 127.0.0.1:6379 get hello world # 查服务信息 127.0.0.1:6379 info serverinfo server的输出里会看到redis_version:6.2.6、uptime_in_seconds等关键信息确认跑的是新装的版本而不是系统里遗留的旧 Redis。还有一个很容易忽略的点Redis 6.x 的redis-cli默认可以启用 RESP3 协议用redis-cli -3进入后HELLO命令可以直接切换协议。如果你要开发 RESP3 相关的功能可以用这个验证客户端和服务端的兼容性。5.2 排查连接失败和内存警告的实战笔记安装过程中我最常被问到的问题基本都是连接失败。归纳起来无非这几个原因Connection refused连接被拒绝八成是服务没起来。先systemctl status redis或ps -ef | grep redis确认进程在不在再看logfile里的日志。还有可能是绑定地址不对默认bind 127.0.0.1外部机器连不上需要改成127.0.0.1 内网IP或0.0.0.0。DENIED Redis is running in protected mode保护模式拒绝这是新手必踩的坑。原因就是前面说的Redis 检测到你在没有密码的情况下允许外部连接主动拦截了。解决方式设置requirepass强密码或把protected-mode设为 no。我强烈建议选前者不要拿安全换省事。NOAUTH Authentication required需要认证连接上了但没输密码。很多可视化工具填了地址端口就点连接没填密码就会报这个。填上配置的requirepass就行。WARNING overcommit_memory is set to 0启动日志里如果出现这个警告说明系统的内存分配策略不适合 Redis 做 RDB 快照。解决方式sysctl vm.overcommit_memory1 # 永久生效写入 /etc/sysctl.conf echo vm.overcommit_memory1 /etc/sysctl.conf意思是允许操作系统到内存分配时“超额承诺”对 Redis 这种需要 fork 子进程做持久化的场景很重要。不设置的话一旦内存不足RDB 保存时容易失败。WARNING transparent huge pages (THP) is enabled这个警告也和 RDB 性能相关。THP 在某些情况下会显著增加 Redis 的延迟。生产环境建议关闭echo never /sys/kernel/mm/transparent_hugepage/enabled5.3 数据安全验证重启后数据还在不在Redis 默认有 RDB 持久化在save规则触发后会把内存中的数据保存到磁盘上的dump.rdb文件里。验证方法很简单写一个 key等几秒重启 Redis再读这个 key。# 写入测试数据 127.0.0.1:6379 set persistence_test ok # 手动触发 RDB 保存 127.0.0.1:6379 save # 重启 systemctl restart redis # 再查 127.0.0.1:6379 get persistence_test ok如果返回okRDB 持久化正常工作如果返回 nil那就要检查dir配置和save规则了。AOF 持久化开启后容灾性更强最多丢失 1 秒的数据appendfsync everysec配置下。我的建议是生产环境两个都开RDB 负责快速恢复AOF 负责精确恢复代价是磁盘空间用得多一些但值得。6. 常见问题速查和实用维护建议6.1 一张表搞懂高频报错我把 Redis 安装、启动、连接阶段最常见的问题收集起来整理成一张速查表碰到直接照着排查症状可能原因解决办法make 编译报 jemalloc 错误系统 jemalloc 兼容问题改用make MALLOClibcmake 编译报 gcc 相关错误gcc 版本过旧升级 gcc 到 5.x 以上启动后立刻退出配置文件语法错误日志路径不存在检查logfile和dir对应目录是否存在本机 ping 通外机连不上bind 只绑定了 127.0.0.1修改 bind 或使用内网 IP外机连接报 DENIEDprotected-mode 阻止设置密码或按需关闭保护模式执行命令报 NOAUTH需要密码登录auth 密码或连接时加-a日志提示 overcommit_memory系统内存分配策略问题设置vm.overcommit_memory1日志提示 THP is enabled透明大页影响性能关闭 THP数据重启后丢失持久化规则未触发或 dir 错误检查 save 配置、dir 路径和文件权限缓存淘汰导致 key 消失maxmemory 设置不合理或策略不当调整 maxmemory检查 maxmemory-policy这十种情况覆盖了绝大多数初次安装 Redis 会遇到的坑。如果你遇到的报错不在这张表里优先看日志文件日志永远比报错信息说得更多。6.2 平时维护 Redis 的几条实操建议安装完只是第一步日常维护才是长期工作。基于我自己的经验分享几个很实在的小建议做好备份目录分类把 Redis 的数据目录、日志目录、配置文件、可执行文件分开建不要全都堆在同一级目录。尤其是数据目录建议找一个容量大、独立挂载的磁盘路径放着避免和数据盘满导致 Redis 写 RDB 失败。连接数监控要早做Redis 的连接数是个重要指标默认maxclients 10000如果程序有连接泄漏连接数会慢慢涨到上限新连接直接被拒绝。建议提前用redis-cli info clients看connected_clients再配合CONFIG GET maxclients确认上限部署监控告警。大 key 要定期清理String 类型的大 key、Hash 的大集合在执行删除或过期时会造成 Redis 停顿。6.2 提供了UNLINK命令删除是异步的不会阻塞主线程遇到大 key 必用。慢查询日志要开着slowlog-log-slower-than和slowlog-max-len两个参数配置好出问题时能快速定位是哪条命令拖慢了服务。别用FLUSHALL出气遇到线上数据乱了第一反应是FLUSHALL清空这个操作非常危险而且默认配置下没有后悔药。建议提前开启 AOF 并定期备份 dump.rdb万一误操作还能恢复。6.3 升级和回滚的思路Redis 6.2.6 装好之后总有一天可能会面临升级。升级前一定要做两件事备份数据文件、记录当前的配置差异。Redis 的小版本升级一般不破坏兼容性但大版本升级比如 6.x 到 7.x有些默认行为变了比如某些命令行为、配置项名称需要对照官方升级文档逐项检查。回滚方案也简单只要数据文件dump.rdb / appendonly.aof还在配置文件不变把旧版本的可执行文件拷回来重启服务数据照样能用。所以安装目录不要覆盖着放建议版本号区分比如/usr/local/redis-6.2.6和/usr/local/redis-7.0.x并存用一个软链接切当前版本。我在实际运维中就是这么做的升级时创建一个redis软链接指向当前要用的版本目录systemd 里启动路径保持不变切换版本就改一下软链接简单、干净、好回滚。7. 最后再说两句Redis 的安装其实不难难的是装完之后对配置的理解和出现问题时的排查思路。我也是从第一次编译报错开始一点点把 Redis 的配置、持久化、ACL、systemd 这些东西弄明白的。如果你照着这篇文章操作下来能跑通一个 Redis 6.2.6那就已经超过了身边一堆只会在 Windows 上点 exe 装软件的同学。我个人最想强调的一点不要跳过make test不要在没设密码的情况下让 Redis 暴露在公网不要把日志和数据跟程序放在同一个目录。这三个习惯能帮你省掉后面无数个半夜被叫起来排查问题的夜晚。Redis 6.2.6 本身是 6.2 系列里非常成熟的版本适合作为学习和生产环境的起点。等把这个版本玩明白了再去接触 7.x 的共享缓存、新的数据结构会顺畅很多。希望大家都能顺顺利利地把 Redis 跑起来。
返回列表