ARTICLE DETAIL

资讯详情

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

Redis下载安装与部署全攻略:从源码编译到排错

Redis下载安装与部署全攻略:从源码编译到排错 做后端开发这些年我见过太多同事在 Redis 下载安装这一步就卡了壳。有的是编译时报错不知道找谁有的是装完了一启动就提示端口被占还有的在 Windows 上折腾了半天发现官方根本没有绿色安装包。其实 Redis 本身是个非常轻量级的项目单机部署也就是十几分钟的事之所以劝退这么多人多半是没搞明白不同平台该走哪条路、版本该怎么挑、编译依赖缺了什么。这篇内容我打算按自己平时给服务器装 Redis 的真实流程来写把 Linux 源码编译、Windows 替代方案、启动配置、常见报错这几个核心环节全部拆开每一步都配上命令和参数解释。不管你是第一次接触 Redis 的新手还是被换机器、搭测试环境折腾过的老手照着做基本都能一把过。1. 动手之前先把版本和安装方式想清楚很多人打开官网就直接点了下载结果装到一半发现版本不对、平台不兼容又得推倒重来。这一步看似简单其实最值得花两分钟想清楚。1.1 版本号到底怎么挑Redis 的版本号遵循主版本.次版本.修订号的规则。拿 7.2.4 举例7 是主版本2 是次版本4 是修订号。在选择时我个人的原则很简单生产环境优先选偶数次版本比如 6.2、7.2这类版本属于稳定长期支持版本社区维护周期更长踩坑的概率低。奇数次版本比如 7.0、7.2 虽然也很稳定但迭代节奏快新功能多适合测试环境尝鲜。不要盲目追最新版。最新版往往刚发布不久文档和周边生态还没完全跟上真要遇到问题搜遍全网可能都找不到几个案例。先在测试环境验证一段时间再上生产是更稳妥的做法。注意区分 RC 版、beta 版这类预发布版本功能可能不全甚至包含已知 bug千万不要在生产环境用。以当前官方维护情况来看7.0 和 7.2 系列是应用最广的稳定版本6.2 在很多老项目里依然坚挺。选一个你熟悉的、社区资料多的版本比选一个最新的版本更重要。1.2 不同平台该走哪条安装路线Redis 官方其实并不提供 Windows 版本的编译产物这一点经常被人忽略。官方文档明确说 Redis 是为 Linux 和 macOS 等 Unix-like 系统开发的Windows 上能跑的那些版本要么是微软以前维护的老版本移植要么是社区开发者自行编译的。所以你的选择基本可以按这个思路来服务器是 LinuxUbuntu、CentOS、Debian 等首选源码编译安装或者用系统自带的包管理器直接安装灵活度最高也是官方推荐的部署方式。本机是 macOS直接用 Homebrew 一条命令就能装好非常省事。本机是 Windows要么用 WSL 装 Linux 子系统跑要么用社区维护的 Windows 移植版要么用 Docker 跑容器。这几条路各有优缺点后面我会单独讲。另外还要考虑一个问题——你是自己用还是给团队用。自己学习验证随便怎么装都行给团队搭一套开发环境就要把安装路径、配置文件、启动方式都规范化免得每个人装的都不一样后面排查问题的时候互相甩锅。2. 官方渠道下载 Redis 的完整流程下载这个环节看似简单但很多人第一步就走错了。有人跑去第三方网站随便下了一个压缩包结果里面捆绑了莫名其妙的东西还有人从搜索引擎点进了钓鱼站下了个假安装包。这里我给出最稳的几条下载路径。2.1 从官网直接拿源码包Redis 的官方网站是 redis.io打开后顶部菜单就能看到 Downloads 入口。进到下载页面你会看到几个关键的下载项当前稳定版Latest Stable比如 7.2.4 这样的版本会以源码压缩包的形式提供文件名像 redis-7.2.4.tar.gz。历史版本列表如果你要装旧版本可以在这里翻找。一些发行版的安装指南以及 Docker 镜像的官方仓库地址。下载命令在 Linux 上用 wget 或 curl 就能搞定wget https://download.redis.io/releases/redis-7.2.4.tar.gz注意官方下载域名是 download.redis.io有时候你会看到 github.com/redis/redis 上的 Releases 页面那个也是官方仓库同样安全。但如果你是从搜索引擎随便点进一个第三方站点就要多个心眼先看看域名对不对、页面有没有刻意模仿官方的痕迹。2.2 用系统包管理器安装省事但有个性化限制如果你的服务器系统比较主流用包管理器安装是最省心的方式。以 Ubuntu/Debian 为例sudo apt update sudo apt install redis-serverCentOS/RHEL 系的话新版系统直接sudo dnf install redis装完以后服务的启停交给 systemd 管理默认配置文件在 /etc/redis/redis.conf数据目录和日志目录也都会自动创建好。这种方式的优点是真的快两分钟就能跑起来缺点是你没法自定义编译参数比如你想装成支持 TLS 的版本、想调整内存分配器包管理器默认的二进制可能就不满足需求。个人建议学习阶段用包管理器没问题省下来的时间可以多去研究配置但如果你要部署到生产环境或者对性能和功能有特殊要求源码编译仍然是最可控的方案。2.3 关于校验文件的小习惯下载完压缩包之后养成校验文件完整性的好习惯。官方在下载页面会提供 SHA-256 校验值你可以这样验证sha256sum redis-7.2.4.tar.gz把输出的哈希值和官网公布的对一下一致再继续解压。这一步虽然多花十秒钟但能避免因为网络传输导致文件损坏、编译到一半才发现包不对的尴尬。3. Linux 下源码编译安装全程记录这是整个部署过程里最关键的一步。Redis 的源码编译其实不算复杂但依赖环境不齐全时报错也很让人头疼。下面我按自己实际操作的过程一步步说。3.1 先解决依赖gcc、make 和基础库Redis 是 C 语言写的编译过程需要 gcc 编译器和 make 工具。很多服务器是最小化安装这两个都没装直接跑 make 就会报“gcc: command not found”。所以第一步是把基础工具链补齐。Ubuntu/Debian 系统sudo apt update sudo apt install -y build-essentialCentOS/RHEL 系统sudo yum groupinstall -y Development Tools # 或者 sudo dnf groupinstall -y Development Tools这里有个细节值得说build-essential 这个包不只是 gcc 和 make还包含了一堆编译必备的库文件比如 libc6-dev、dpkg-dev 等。很多新手只装了 gcc结果 make 的时候照样报缺头文件的错。所以与其一个个补不如直接把这个工具组整体装上。另外如果你想编译出来的 Redis 支持更好的内存性能建议确保系统里有 jemalloc 相关依赖。Redis 源码里其实自带了一个 jemalloc 的副本但如果系统里已经装了 jemalloc它可能会优先尝试链接系统的版本。为了避免裂化问题我一般直接让 Redis 用自带的 jemalloc这点在 4.2 节会讲。3.2 解压、编译、安装的三步走把下载好的源码包上传到服务器然后按顺序执行tar -xzf redis-7.2.4.tar.gz cd redis-7.2.4 make如果一切顺利你会看到一堆 gcc 编译的输出滚动过去最后出现类似“Hint: It‘s a good idea to run make test”的提示。这说明编译成功了。但如果你在编译过程中看到类似这样的报错zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory这个问题的原因上面提到过——Redis 在编译时会尝试用系统的 jemalloc但系统里要么没装要么版本不匹配。最直接的解决办法是让 Redis 强制使用自带的 jemallocmake distclean make MALLOClibc或者明确指定使用 jemallocmake MALLOCjemalloc个人更推荐 MALLOClibc 这个选项它让 Redis 退回到标准的 C 内存分配器兼容性最好。当然生产环境追求极限性能时jemalloc 在减少内存碎片方面确实有优势自己权衡即可。编译完成后不要急着直接启动源码目录里的 redis-server而是执行安装命令把可执行文件放到系统目录make install默认会安装到 /usr/local/bin/包括 redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-rdb、redis-sentinel 这几个可执行文件。你可以用 which redis-server 验证一下是否安装成功。3.3 编译过程中我踩过的两个坑第一次编译很容易遇到两个问题这里提前打个预防针。第一直接 make 的时候报错“致命错误xxxx.h没有那个文件或目录”。这种情况十有八九是系统缺开发库比如 tcl 相关头文件。Redis 的 make test 环节需要 tcl 支持所以如果后面你要跑 make test先装 tcl 和 tcl-devsudo apt install -y tcl tcl-dev第二make 到一半突然中断再重新 make 时报各种奇怪的错。这时候别硬着头皮继续 make先清理编译缓存make distcleandistclean 会清掉之前生成的 .o 目标文件和 Makefile 缓存相当于让整个编译环境回到原始状态。我见过太多人第一次编译失败之后反复 make 还是报同样的错就是因为没有清理干净。记住这个命令能帮你省不少时间。3.4 用配置文件把 Redis 变成后台服务默认情况下直接执行 redis-server它会在前台运行CtrlC 就停了。这在调试时很方便但作为服务部署显然不行。Redis 自带了一个配置文件 redis.conf在源码目录里可以找到通常编译安装后建议复制到 /etc/redis/ 下面sudo mkdir -p /etc/redis sudo cp redis.conf /etc/redis/redis.conf然后编辑这个配置文件把关键的几项调整一下。daemonize 参数决定是否以守护进程方式运行。Redis 6.0 之后的版本默认是 no如果你希望直接通过 redis-server /etc/redis/redis.conf 启动后不占用终端就把它改成 yesdaemonize yes另外一个重要参数是 supervised。如果你用的是 systemd 管理服务建议保持 supervised no让 systemd 来处理进程生命周期如果你习惯直接用 nohup 或者 后台运行那 daemonize yes 就足够。还要注意 pidfile 和 logfile 的配置。设置好之后Redis 的进程号会写入 pidfile 指定的文件日志会写入 logfile 指定的路径方便排查问题pidfile /var/run/redis_6379.pid logfile /var/log/redis/redis.log这里记得先把日志目录创建出来并保证运行用户有写权限否则 Redis 启动时会报“Cant open the log file”之类的错误。3.5 用 systemd 把 Redis 注册成开机自启服务直接在命令行运行 redis-server 虽然也能用但管理起来很原始。推荐用 systemd 来管理 Redis 服务这样就能享受开机自启、崩溃自动拉起、日志集中管理等便捷功能。在 /etc/systemd/system/redis.service 中写入[Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecReload/bin/kill -s HUP $MAINPID ExecStop/bin/kill -s QUIT $MAINPID Restartalways Userredis Groupredis PIDFile/var/run/redis_6379.pid [Install] WantedBymulti-user.target这里有几个地方要注意。ExecStart 后面的配置文件路径一定要和你实际放置的路径一致User 和 Group 建议指定一个专用账号比如 redis不要用 root 直接跑服务这是基本的安全习惯。如果系统里还没有 redis 用户可以执行sudo useradd --system --user-group redis同时把相关目录的所有权交给这个用户sudo chown -R redis:redis /var/log/redis /var/lib/redis然后重新加载 systemd 配置并启动服务sudo systemctl daemon-reload sudo systemctl enable redis sudo systemctl start redis sudo systemctl status redis看到 status 里显示 active (running)说明服务已经起来了。以后无论是重启服务器还是重启服务都可以直接用 systemctl 来操作非常省心。4. Windows 下安装 Redis 的几条可行路径虽然官方不维护 Windows 版但很多人在开发机上用的就是 Windows这一节专门说说 Windows 上的安装方案。4.1 方案一用 WSL 跑 Linux 版最接近生产环境如果你装了 WSL2Windows Subsystem for Linux最简单的办法就是在 WSL 里按第 3 节的流程走一遍。优点是完全复刻 Linux 环境和生产服务器保持一致的部署方式缺点是要求 Windows 10/11 支持 WSL并且要花点时间配置子系统的网络。在 WSL 里装完 Redis 后Windows 侧的代码要访问它注意 WSL2 的 IP 地址和 localhost 映射问题。通常 WSL2 对 localhost 做了转发但有时候需要手动确认。如果你只想在本机开发调试问题不大如果要让局域网内其他机器访问还要额外配置 WSL 的端口转发。4.2 方案二社区维护的 Windows 移植版如果你实在不想折腾 WSL还有一个折中选择——用 tporadowski 这个开源项目维护的 Redis Windows 版。这个项目提供了 Redis 5.0.14 和 Redis 7.0.x 等版本的 Windows 移植版本可以直接下载 zip 包解压使用也提供了 MSI 安装包。zip 包的方式非常直接解压到你想要的目录比如 D:\Redis然后双击或命令行启动 redis-server.exeredis-server.exe这样就跑起来了默认端口 6379。想要按照配置文件启动的话redis-server.exe D:\Redis\redis.windows.conf注意这个项目的版本相对官方会滞后一些而且部分高级特性比如某些模块在 Windows 上移植得并不完整。所以它适合本机开发测试真到了生产环境还是建议老老实实用 Linux。4.3 方案三用 Docker 跑 Redis 容器如果你的 Windows 上装好了 Docker Desktop那其实还有一条更干净的路。直接拉镜像docker run -d --name redis-test -p 6379:6379 redis:7.2Docker 官方仓库的 redis 镜像是官方维护的版本和 Linux 版完全一致也不存在性能阉割的问题。好处是你的 Windows 系统里不会残留一堆 Redis 相关的乱七八糟目录想清理环境的时候删容器就行。唯一要注意的是数据持久化。默认启动的容器数据存在容器内部容器一删数据就没了。要挂载数据目录的话docker run -d --name redis-test -p 6379:6379 -v D:/redis-data:/data redis:7.2 redis-server --appendonly yes把容器里的 /data 映射到本机的 D:/redis-data这样 AOF 持久化文件就会写到宿主机上删容器也不怕丢数据。5. 安装成功之后的第一轮验证装完 Redis别急着写业务代码先花几分钟从客户端连进去测一测确认整条链路是通的。这一步能暴露很多潜在问题。5.1 redis-cli ping 与基本读写最简单粗暴的验证方式就是 redis-cli ping。在终端里执行redis-cli ping如果返回 PONG说明服务端和客户端通信正常。然后再试试最基本的读写redis-cli set hello world redis-cli get hello能正确读到 world说明存储引擎的核心功能没问题。如果你设置了密码那么连接时需要加上 -a 参数或者进入交互模式后用 AUTH 命令验证。这里我多说一句不要在命令行里直接写密码因为会留在 shell 历史记录里。更安全的做法是redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379 AUTH yourpassword或者在 redis-cli 连接后使用交互模式操作密码自然不会被记录到 history 里。5.2 用 redis-benchmark 做个简单压测Redis 自带一个压测工具 redis-benchmark装完顺手跑一下能直观感受它的性能。最基本的用法redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000-c 指定并发连接数-n 指定总请求数。跑完以后你会看到类似“100000 requests completed in 0.55s”这样的输出以及每秒请求数。普通机器上Redis 跑十万级 QPS 是很轻松的事这是它作为缓存的底气所在。如果你发现压测结果特别低比如每秒只有几千次请求那大概率不是 Redis 本身的问题而是服务器配置、网络、或者 CPU 频率调节策略等原因。这时候别急着找 Redis 的茬先看一下服务器负载和网络延迟。6. 常见安装错误与故障排查实例我整理了这些年给别人排障时遇到最多的几类问题做成一个速查表遇到问题可以先对照检查。6.1 编译阶段问题速查报错现象可能原因解决办法gcc: command not found系统缺编译器安装 build-essential 或 Development Toolsfatal error: jemalloc/jemalloc.h系统 jemalloc 不匹配make distclean 后改用 make MALLOClibc/bin/sh: cc: command not foundcc 链接缺失检查 gcc 是否安装成功make test 报错缺少 tclapt install tcl tcl-dev 或 yum install tcl提示时钟不同步系统时间和下载源不一致ntpdate 或 systemctl restart systemd-timesyncd其中 jemalloc 的问题我要多说两句。有的系统上装过某些软件可能带了一个旧版本的 jemalloc 动态库Redis 编译时自动检测到了就尝试去链接结果版本对不上直接编译失败。遇到这种情况最干净的做法就是 make distclean 后重新用默认方式编译或者明确指定 MALLOClibc不要跟它在环境变量上拉扯。6.2 启动阶段的典型故障报错现象可能原因解决办法Cant open the log file日志目录不存在或权限不足创建目录并 chown 给 redis 用户Address already in use6379 端口被占用netstat -tlnp 查看占用进程kill 或换端口Protected mode is enabled未配置 bind 且未设置密码修改 bind 或设置 requirepassCannot allocate memory系统 overcommit 限制设置 vm.overcommit_memory1Denied Redis current config用户执行了受限制的命令检查 rename-command 配置WARNING: overcommit_memory is set to 0内核参数不推荐写入 /etc/sysctl.conf 永久生效端口被占用是最常见的启动失败原因。有时候你明明没起过 Redis但系统里其他服务会把 6379 占掉。排查命令netstat -tlnp | grep 6379找到占用进程确认不是重要服务后 kill 掉或者干脆改 Redis 配置把端口换成别的port 6380另外一个很典型的坑是 protected-mode。Redis 默认开启保护模式当你没有设置密码、也没有配置 bind 时它只允许本机连接其他机器连过来会被拒绝。这在安全上是好事但也经常导致“明明 Redis 起来了别的机器就是连不上”的困惑。要解决要么设置密码requirepass yourstrongpassword要么精确控制 bind只允许内网网段访问bind 127.0.0.1 192.168.1.100这两者通常建议同时配置而不是关掉保护模式了事。6.3 内核参数调一调性能更稳安装完成并不代表万事大吉。Redis 在启动日志里经常会给出一堆警告比如 overcommit_memory 和 somaxconn。这些参数直接关系到 Redis 在高并发场景下的稳定性。第一个是 vm.overcommit_memory。Redis 做持久化时fork 子进程需要预分配内存如果系统 overcommit 策略太保守fork 可能会失败。推荐设成 1echo vm.overcommit_memory 1 /etc/sysctl.conf sysctl -p第二个是 net.core.somaxconn。这个参数控制 TCP 连接队列长度默认 128 太小高并发时连接容易被丢。推荐调到 1024 或更高echo net.core.somaxconn 1024 /etc/sysctl.conf sysctl -p第三个是 Transparent Huge PagesTHP。Redis 官方文档直接建议关闭因为 THP 会在内存分配时引入延迟导致延迟毛刺echo never /sys/kernel/mm/transparent_hugepage/enabled这三个参数改完后重启一下 Redis启动日志里的 WARNING 会少很多。别嫌麻烦这几步在做性能调优的时候早晚要遇到。7. 配置安全基线密码、绑定和重命名高危命令安装到这一步服务已经能跑了但离“合格部署”还差一道安全配置。很多人图省事Redis 装完就裸奔在公网上结果被扫描器盯上数据被加密勒索这种案例我见过不止一次。7.1 给 Redis 加上密码在 redis.conf 里找到 requirepass 这一项取消注释并设置一个强密码requirepass Zx9#k2Lpq7W改完配置后重启服务再用 redis-cli 连接时任何操作前都需要先 AUTH。需要注意的是密码会明文存在配置文件里所以配置文件本身的权限要收紧chmod 600 /etc/redis/redis.conf chown redis:redis /etc/redis/redis.conf另外命令行操作时尽量别用 redis-cli -a 这种带密码的参数它会把密码暴露给系统进程列表用 env 或者交互模式更安全。7.2 绑定网卡别让 Redis 暴露在公网默认配置下 Redis 监听所有网卡。如果你的服务器有公网 IP这就等于把数据库裸奔在互联网上。强烈建议设置 bindbind 127.0.0.1 10.0.0.5只保留本机回环地址和私有网段地址公网网卡一律不监听。如果你的应用和 Redis 不在同一台机器那就通过内网地址连接也别直接开公网端口。另一个值得做的设置是重命名高危命令。比如 FLUSHALL、FLUSHDB、KEYS、DEBUG 这些命令在生产环境里很容易被误操作或者被恶意利用。可以在配置文件末尾加rename-command FLUSHALL rename-command FLUSHDB rename-command DEBUG 两行配置直接把这些命令禁用掉业务代码里如果确实需要再用其他方式替代。KEYS 命令虽然一般不建议大规模使用但调试时需要也可以重命名成一个不常见的名字防止被扫描器猜到。7.3 验证安全配置是否生效配置完以后重新连接 Redis试试从其他机器访问、试试未授权访问、试试禁用的命令三个维度都测一遍。比如在其他机器上执行redis-cli -h 你的IP -p 6379如果配置正确连接会被拒绝或要求密码。再在 Redis 里执行127.0.0.1:6379 FLUSHALL应该提示命令不存在或权限不足。这样一轮验证下来心里就有底了。8. 装好后跑几个命令搞懂 Redis 的核心数据类型安装和配置讲完了最后给自己一个小任务用命令行亲手把 Redis 的几种核心数据类型过一遍。很多人在网上看了一堆介绍不如实际操作十秒钟印象深刻。8.1 String、Hash、ListString 是最基础的类型缓存、计数器都能用redis-cli set login:count 1 redis-cli incr login:count redis-cli get login:countHash 适合存对象比如用户信息redis-cli hset user:1001 name James age 28 redis-cli hgetall user:1001List 可以用来做消息队列、时间线之类的场景redis-cli rpush myqueue task1 redis-cli rpush myqueue task2 redis-cli lpop myqueue这几个命令敲完基本就能理解为什么 Redis 能在一个服务里同时搞定缓存、队列、排行榜这么多种需求。8.2 Set 和 Sorted SetSet 是无序集合适合做去重、共同好友这类运算redis-cli sadd tags:article1 redis database redis-cli sadd tags:article2 redis cache redis-cli sinter tags:article1 tags:article2Sorted Set 是带权重的集合最典型的场景就是排行榜redis-cli zadd leaderboard 100 Alice redis-cli zadd leaderboard 80 Bob redis-cli zadd leaderboard 120 Carol redis-cli zrevrange leaderboard 0 2zrevrange 返回前三名分数从高到低排好。至此五种核心数据类型都亲手过了一遍你对 Redis“为什么这么受欢迎”的理解会比看十篇文章都深刻。9. 一点个人经验最后聊点实在的。我装 Redis 的次数太多了从最早的 2.8 到现在的 7.x踩过的坑能写一本书。核心就一句话——安装只是万里长征第一步真正的功夫在配置和安全上。我个人习惯是在安装完以后把 redis.conf 里的每一项配置都过一遍遇到不懂的就去官方文档查虽然一开始慢但后面排查问题的时候能快很多。还有个小技巧每次修改配置文件之前先备份一份cp /etc/redis/redis.conf /etc/redis/redis.conf.bak改坏了随时能回滚这个习惯救过我太多次了。再分享一个本子技巧如果你在家里的电脑上想快速试 Redis又不想装环境直接用 Docker 最舒服三分钟就能跑起来。等真正要上生产服务器再回过头来认真编译安装那时候你对整个过程已经轻车熟路了。Redis 的下载安装这件事网上教程很多但真正把每个报错原因讲清楚的不算多。希望这篇基于实操的记录能帮你少走点弯路。装完以后建议你立刻去把数据类型、持久化、主从复制这几个方向再深入看看Redis 的世界比安装命令要精彩得多。
返回列表