1. 安装前的关键决策:选对方案比动手更重要
1.1 Redis是什么,为什么到处都要装它
Redis,全称Remote Dictionary Server,本质上是一个基于内存的键值存储系统。你可以粗暴地把它理解成一个住在内存里的超级HashMap,但这个HashMap的读写速度非常快,还支持String、Hash、List、Set、Sorted Set等基础数据结构,并且能在内存之外把数据定期或者按操作日志落盘。正是这套"快 + 数据结构丰富 + 能持久化"的组合,让它成为缓存、会话共享、分布式锁、简易消息队列和排行榜等场景的首选。
后端项目里只要有一两个高并发接口或者需要共享状态的模块,基本就会需要Redis。所以你在本地开发、搭演示环境、跑课程项目时,十有八九都要装一个。问题在于,Redis官方对Windows的支持一直很暧昧,Linux上一条apt install或者yum install就完事,Windows和Mac则各有各的坑。
1.2 Windows和Mac的安装方案对比
不急着动手,先把可选方案列出来,心里有底之后,再选一条路走。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Windows原生编译版(5.0.14.1) | 下载解压即用,不依赖任何其他环境 | 版本停留在5.0,非官方维护 | 快速跑通、学习测试 |
| WSL2安装Redis | 环境接近Linux生产环境,版本可控 | 需要安装WSL2,有额外开销 | 想模拟生产部署的Windows用户 |
| Docker容器运行Redis | 跨平台一致、版本灵活、部署快 | 需要掌握Docker基础,内存开销稍大 | 团队统一环境、本地开发主力 |
| macOS Homebrew | 一条命令安装,升级维护方便 | 需要先搞定Homebrew,网络可能要调 | Mac开发机首选 |
1.3 我推荐的选型思路
我自己的习惯是严格分场景来选:
- 只是听课、照着书上敲代码,或者临时跑个demo,Windows上直接用原生编译版最省事,因为解压就能用,不用理解容器、不用装额外组件。
- 团队开发环境或者自己主力开发机,我强烈建议Docker,版本可以跟着官方走,之后还可以用docker-compose把Redis和其他中间件一起编排起来,一套配置全团队复用。
- Mac本地跑,Homebrew最舒服,因为Homebrew本身就管理了路径、服务和安全策略,Redis升级也方便,一条命令解决。
选型完成后,再按对应平台动手。下面我把Windows、Mac的完整过程分开讲,最后再补一遍Docker统一方案,哪个适合你就照着哪段做。
2. Windows安装实录:从下载到跑通第一条命令
2.1 下载适合Windows的Redis版本(避坑指南)
Windows上之前有过微软官方的Redis分支,后来停更了,长期停留在3.0/3.2的样子。现在社区里用得比较多的是tporadowski维护的Windows原生版本,最新到5.0.14.1,虽然版本号不是最新,但对大多数本地开发场景已经够了。如果你非要7.x甚至更高版本,那就别在下原生版上挣扎了,直接切到Docker或者WSL,用Windows版就没有必要硬扛低版本。
下载时去GitHub对应仓库的Release页面,找Redis-x64-5.0.14.1.zip。注意看文件大小,下载完先确认zip能不能完整解压。我见过很多次有人下载到一半断网,解压时提示"文件损坏"或者"Zip文件格式错误",重下一遍基本就能解决。解压路径建议用纯英文且不带空格的目录,比如D:\Redis或者C:\Redis,虽然带中文路径大多数时候也能跑,但后续只要在配置文件里写路径,或者用命令行脚本操作,中文路径很容易出各种莫名其妙的坑。
顺带提醒一句:搜索"redis windows 下载"的时候,会看到大量看起来很像官网的第三方下载站,下载速度又慢又可能捆绑一堆东西。认准GitHub仓库或者官方文档里引用的渠道,不要点那些"高速下载站"。
2.2 解压启动与验证
解压完之后,目录里会有几个关键文件,认准它们:
- redis-server.exe:服务端程序
- redis-cli.exe:命令行客户端
- redis.windows.conf:默认配置文件
- redis.windows-service.conf:注册Windows服务时使用的配置文件
打开cmd,进入目录:
cd /d D:\Redis前台启动:
redis-server.exe redis.windows.conf正常的话,终端会打印Redis的ASCII Logo和启动日志,中间有一行比较关键的输出:
* Ready to accept connections tcp这就代表服务已经起来了,默认监听6379端口。这一步先不要关这个窗口,重新开一个cmd,进入同一个目录,运行:
redis-cli.exe在交互界面里输入:
ping如果返回:
PONG说明服务端和客户端都在正常工作,Redis已经能用了。从下载到第一次验证通过,整个过程不会超过五分钟,这也是原生版最吸引人的地方。
要关闭服务,可以在redis-cli里执行shutdown,或者直接在前台启动的窗口按Ctrl+C。但注意,如果你是用前台方式启动的,关掉窗口就等于关掉服务,所以这也引出下一步:注册成Windows服务。
2.3 注册成Windows服务:让Redis开机就跑
每次都手动开一个cmd窗口去跑redis-server.exe,开发时无所谓,但如果你想像Linux的systemd服务一样让Redis开机自启、后台常驻,那就需要把Redis注册成Windows服务。
Redis for Windows的包里自带了服务注册命令。用管理员权限打开cmd,进入Redis目录,执行:
redis-server.exe --service-install redis.windows.conf --service-name Redis然后再启动这个服务:
redis-server.exe --service-start之后你可以在服务管理器(Win+R输入services.msc回车)里看到名为Redis的服务,也可以这样查状态:
sc query Redis停止服务用:
redis-server.exe --service-stop彻底卸掉这个服务用:
redis-server.exe --service-uninstall这里有个很常见的坑:安装服务时如果不加--service-name,默认服务名就叫Redis;如果以前注册过旧实例,新版本注册时容易提示"服务已存在"。先按服务名停止并删除旧服务,再重新安装就不会冲突了。
2.4 Windows安装中的几个关键注意事项
第一,双击redis-server.exe经常闪退。很多人刚下载完,习惯性拿着鼠标去双击exe,结果窗口一闪就没了,误以为安装失败。实际上Redis启动时如果找不到配置文件,或者配置里有非法参数,终端窗口就会快速退出,你看不到报错,就会觉得"这不就是个坏文件吗"。正确的姿势是像上面那样用cmd进入目录再启动,这样能看到完整报错日志,排查起来有的放矢。
第二,Windows防火墙弹出提示时,如果只是本机程序连接Redis,可以点取消;如果局域网里其他机器要访问这台Redis,记得允许放行6379端口,否则客户端连接会被防火墙拦下,那种"明明服务在跑别人就是连不上"的尴尬情况,八成就是防火墙。
第三,Windows版的Redis默认配置很可能绑定的是127.0.0.1,也就是只允许本机访问。如果后面你用别的机器去连,会一直连不上,这不是Redis坏了,而是配置问题,具体修改方式我在第5章的配置详解部分会展开讲。
3. Mac安装实录:Homebrew一句话搞定(附失败排查)
3.1 先确认Homebrew是否可用
Mac上安装Redis最主流的方式就是Homebrew。第一步先确认自己的机器有没有装:
brew --version如果返回了版本号,说明已安装;如果提示command not found: brew,说明还没装。
Homebrew的安装命令官方长这样:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"但这条命令在部分网络环境下经常卡在下载阶段,比如卡在Updating Homebrew,或者下载到一半就报错退出。我建议首次安装时直接换国内镜像源。清华、中科大等镜像站都有Homebrew的安装脚本,一般是一行环境变量加上面这个官方命令,或者直接用镜像站提供的替代脚本。具体操作以镜像站当前文档为准,装完之后再把homebrew-core和homebrew-bottles的镜像地址也切换好,这样后续brew install下载任何软件包都会稳定很多。
注意,切换镜像只是在普通层面做加速,不要把它想得太复杂。装Homebrew的失败案例里,绝大多数都是网络中断和源地址连不通,这两个问题都可以通过镜像解决。
3.2 安装并启动Redis
确认Homebrew可用后,安装就一行命令:
brew install redis这个过程会自动把依赖下载、编译或者直接下载预编译包,然后放到Cellar目录里。安装完成后,可以先确认一下版本:
redis-server --version正常情况下你会看到Redis 7.x的版本号,比Windows原生版的5.0要新不少,这也是Mac开发体验的一个隐性优势。
前台启动很简单:
redis-server它会用默认配置启动,监听6379端口。日志输出和Windows启动时长得差不多,看到Ready to accept connections就代表成功了。
不过Mac上更常用的做法是通过brew services把Redis注册成后台服务:
brew services start redis这个命令会自动以后台方式启动Redis,并且开机时自动拉起。验证方式照旧,新开一个终端窗口执行:
redis-cli ping返回PONG就是通了。
3.3 配置开机自启与常用管理命令
现在看看brew services到底做了什么。它本质上是在~/Library/LaunchAgents目录下注册了一个LaunchAgent,所以你登录系统后这个服务会自己起来。与它配套的管理命令值得记一下:
查看当前服务状态:
brew services list输出里能看到redis是started还是stopped。
停止并取消开机自启:
brew services stop redis重启:
brew services restart redis如果你不想用brew services,而想纯前台方式跑,就执行redis-server加配置文件路径。Mac上Redis的配置文件路径根据芯片不同有差别,这两个路径非常容易记混:
- Intel芯片Mac:/usr/local/etc/redis.conf
- Apple芯片(M1/M2/M3等)Mac:/opt/homebrew/etc/redis.conf
每次修改配置文件之后,如果是前台启动的就重启进程;如果是brew services管理的,就执行brew services restart redis让配置生效。
3.4 Mac专属坑位与解决办法
Mac上安装部署Redis的坑,大多集中在以下几个方面。
第一,brew install长时间没反应,大概率是网络问题。把Homebrew源切成国内镜像,装起来会顺畅很多。装完Redis如果以后还要装别的包,同样受益。
第二,启动时报错"redis-server: can't open config file ..."。原因很简单:配置文件路径写错了。用brew services启动通常不会遇到,但手动执行redis-server /etc/redis.conf这种操作时很容易踩坑。Mac上路径不是/etc/redis.conf,而是上面提过的/usr/local/etc目录或者/opt/homebrew/etc目录,按自己芯片去填。
第三,开机自启不生效。有些朋友发现重启电脑后Redis没起来,先看看是不是确实用了brew services start。如果只是手动起过一次,重启当然不会自启。另外,不同macOS版本对LaunchAgents的处理细节有差异,可以执行brew services list确认状态,如果显示started就没问题。
第四,端口被占用。Mac上执行:
lsof -i :6379看哪个进程占着6379,如果是不需要的进程就kill掉;如果6379是你另一个服务在用的,就去redis.conf里把port改成别的端口,比如6380。
4. Docker统一部署方案:一台机器一行命令
4.1 为什么我推荐开发机用Docker
Windows原生版版本老,Mac Homebrew流程虽然顺畅但和公司的Linux生产环境毕竟有差异。如果你的日常开发已经用Docker,或者你希望跟你同事的环境完全一致,那么Docker一定是所有平台里最省心的方案——没有之一。
Docker的好处是:
- 官方镜像覆盖各个版本,想用哪个tag就用哪个
- 一条命令就能拉起服务,不用关心宿主机是Windows还是Mac
- 数据卷挂在本地,删除容器不丢数据
- 之后的Redis集群、主从演练,docker-compose直接编排
唯一门槛是你要先装好Docker。Windows上推荐Docker Desktop(依赖WSL2),Mac上可以下载桌面安装包或者用Homebrew装。
4.2 Windows版的Docker Desktop注意点
Windows上装Docker Desktop之前,建议先把WSL2准备好。安装器一般会自动检测,如果缺组件会提示。装好后在Docker Desktop的设置里确认Use WSL 2 based engine是开启的。
启动Docker Desktop之后,日常操作完全在终端里完成,图形界面其实不怎么需要碰。但有一个点需要特别注意:Windows上Docker Desktop需要硬件虚拟化支持,老一点的CPU要去BIOS里打开VT-x/AMD-V,不然装完启动不了。如果你确实打不开虚拟化,就不要强行用Docker,老老实实回到前面的Windows原生版方案,一样能满足本地开发和学习的需要。
4.3 Mac版的Docker Desktop注意点
Mac上装Docker有两种常见途径:官网下载Docker Desktop安装包,拖进Applications就行;或者用Homebrew执行brew install --cask docker。
Apple芯片的Mac默认支持Docker Desktop。启动后顶部状态栏出现鲸鱼图标就说明后端在运行。Mac版Docker Desktop对内存要求偏高,开发机如果只有8GB内存,跑一个Redis容器问题不大,但如果同时开好几个容器,内存就要在Preferences里适当调大,不然容器会莫名其妙被杀掉。
4.4 用Docker运行Redis并持久化数据
无论Windows还是Mac,一旦Docker就绪,Redis的启动命令就是完全一样了。先拉最新的7.x镜像再跑:
docker run -d --name redis-dev -p 6379:6379 redis:7.4这里-d是后台运行,--name redis-dev是给容器起名,-p 6379:6379把宿主机的6379映射到容器里的6379。跑起来后验证:
docker exec -it redis-dev redis-cli ping一样能拿到PONG。
如果要设置密码,可以直接在命令行里加:
docker run -d --name redis-dev -p 6379:6379 redis:7.4 --requirepass yourStrongPassword注意,--requirepass这类参数要放在镜像名之后,因为它会作为Redis服务端的启动参数传给容器内的redis-server,这一点特别容易搞错。
数据持久化时挂载一个本地目录:
docker run -d --name redis-dev -p 6379:6379 -v /path/to/redis-data:/data redis:7.4 --appendonly yes在Windows里/path/to/redis-data可以写成C:\redis-data或者D:\redis-data,但在PowerShell下要注意路径转义;Mac下用~/redis-data更顺。
查看容器日志:
docker logs -f redis-dev停掉再删容器:
docker stop redis-dev docker rm redis-dev这套方案最大的优势是整个流程换台机器一模一样,不用再背两套平台的命令。我自己的开发机就是从Windows原生版切到Docker之后,再也没回去过。
5. 配置文件核心参数详解:别让Redis裸奔
5.1 网络相关:bind、port、protected-mode
Redis装好能跑只是第一步。如果只是本机自嗨,默认配置完全没问题;但只要你想让别的电脑连上来,配置文件这几个参数就必须弄明白,否则你会一直被"为什么连不上"折磨。
先看bind。默认配置里是bind 127.0.0.1,意思是只有本机IP能连接Redis,其他机器访问会被拒绝。开发时想局域网访问,常见的写法是改成:
bind 0.0.0.00.0.0.0表示监听所有网卡。但这么做之后,你必须配合后面的密码和保护模式设置,否则你的Redis基本等于裸奔,公网上扫描Redis端口的脚本一分钟能打好几百次。
再看protected-mode。这是Redis在早期安全事件之后引入的保护机制,默认是yes。它的规则有点绕:只有既没有设置bind、又没有设置密码时,保护模式才会限制只接受本机回环地址连接;如果你设置了bind 0.0.0.0,但密码没设置,它依然会拒绝外部连接。所以不少人在没设密码的情况下改了bind,发现外部还是连不上,就是这个原因。
还有port,默认6379。如果6379被占了,改成6380之类的也是常见操作,客户端和程序连接的端口要跟着一起改。Windows上检查端口:
netstat -ano | findstr :6379Mac/Linux上检查端口:
lsof -i :6379看到具体进程号之后,再决定是杀掉占用进程,还是干脆改Redis端口。
5.2 认证相关:requirepass与完整连接命令
设置密码是在配置文件里把requirepass那一行的注释去掉,然后填上你的密码:
requirepass 你的密码改完后重启Redis。之后客户端连接时就要带密码了:
redis-cli -a 你的密码这里提醒一个细节:命令行里直接带密码,进程列表里会明文显示,旁边的人或者监控脚本执行ps就能看到密码。为了安全,可以不用-a,而是通过环境变量传递:
export REDISCLI_AUTH="你的密码" redis-cli这样密码就不会出现在命令行参数里。程序连接的时候,比如Python的redis-py:
import redis r = redis.Redis(host="127.0.0.1", port=6379, password="你的密码", decode_responses=True) print(r.ping())如果输出True就说明连接成功,顺便验证了密码配置生效。
5.3 持久化相关:RDB、AOF
Redis是内存数据库,数据默认都存在内存里,但Redis提供了持久化机制,能挽回内存数据丢失之后的损失。持久化有两个兄弟:RDB和AOF。
RDB(Redis DataBase):按配置的规则把某个时间点的内存快照写进dump.rdb文件。默认配置类似:
save 900 1 save 300 10 save 60 10000意思分别是:
- 900秒内至少有1次写入,触发一次快照
- 300秒内至少有10次写入,触发一次快照
- 60秒内至少有10000次写入,触发一次快照
你可以在redis.conf里按自己的数据量调整。RDB文件小、恢复快,但因为是定时快照,可能丢最后一次快照之后的数据。
AOF(Append Only File):记录每条写操作命令,追加到appendonly.aof文件里。默认是关闭的,需要改配置:
appendonly yesAOF可以设置appendfsync策略,everysec(每秒钟同步一次)是比较折中的选择,最多丢1秒数据。生产环境经常两者组合用:RDB做快照恢复主力,AOF保证更细的日志。
Windows原生5.0的配置里也支持这些参数,在redis.windows.conf里改即可。改的时候注意保持配置语法正确,Redis配置文件的形式是"配置项 值",不要加多余的空格缩进。Mac或Docker容器内同理。数据文件默认会写在配置里dir指定的目录,Windows下默认可能是./,也就是启动目录,最好改成你明确的一个路径,不然服务注册成Windows服务后工作目录会变化,dump文件就会写到莫名其妙的地方。
5.4 内存相关:maxmemory和淘汰策略
另一个必须提前配置的就是内存上限。Redis当缓存用的时候,如果不限制内存,写多少它就吃多少,最后把机器内存吃完,整个系统都可能卡死。所以生产环境基本都会设:
maxmemory 2gb数值根据机器内存和业务量来定。当内存达到上限时,新写入怎么处理?由maxmemory-policy决定。常用策略有:
- allkeys-lru:在所有key里按LRU淘汰最久没用的
- volatile-lru:只在设置了过期时间的key里淘汰
- allkeys-lfu:按LFU淘汰访问次数最少的
- noeviction:写不进去,直接返回错误,数据库模式常用
如果做纯缓存,我一般用allkeys-lru;如果Redis里还存了不能丢的业务数据,不要轻易用allkeys-lru,否则数据被淘汰哭都来不及。
6. 高频坑位预警:安装部署踩坑实录
6.1 Windows高频问题
第一个:redis-server.exe双击闪退。前面提过,本质是配置加载失败或者找不到配置文件。用cmd方式启动就能看到完整报错。常见原因是配置文件路径写错、配置里出现非法字符、或者工作目录里没有配置文件。
第二个:启动后redis-cli连不上。先在cmd里执行:
netstat -ano | findstr :6379如果没有输出,说明服务没起来;如果有输出,但本机都连不上,八成是配置里bind设为了非本机地址,改回127.0.0.1重启。如果本机能连、局域网其他机器连不上,重点查Windows防火墙和bind 0.0.0.0。
第三个:运行一会儿出现"MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"。意思是快照写盘失败,服务为了安全会拒绝写操作。常见原因是当前目录无写权限或者磁盘满了。把配置文件里的dir改到有写权限的目录,比如D:\Redis\data,确认目录存在且当前用户能写,基本就能解决。
第四个:Windows服务卸载不掉。注册服务后,如果用普通权限的cmd执行--service-uninstall,有时会提示没有权限,需要管理员权限重试。如果报告服务不存在但services.msc里还有残留,可能是服务名不一致,用sc delete 服务名清理。
6.2 Mac高频问题
第一个:brew安装时卡住。多数是网络问题。把homebrew-core和bottles换到国内镜像,然后重新update。安装完成前不要强行Ctrl+C,否则可能残留半成品,后面再装会报各种奇奇怪怪的错。
第二个:brew services start redis报错"Error: Failure while executing; /usr/bin/launchctl bootstrap"。常见于macOS版本更新后launchctl的语义发生变化。先用brew services kill redis清理,再brew services start redis重新注册;实在不行,就改用手动方式redis-server --daemonize yes临时后台运行。
第三个:修改配置后没有生效。检查配置文件路径和实际启动时加载的配置文件是否一致。手动启动时如果直接执行redis-server,它加载的可能是默认配置,不是你改的那个文件。启动时显式指定配置路径:
redis-server /usr/local/etc/redis.conf这样最稳妥。
6.3 跨平台通用问题速查表
把几个高频问题做成速查表,排查起来特别方便:
| 现象 | 可能原因 | 排查与解决办法 |
|---|---|---|
| redis-cli ping 返回 connection refused | 服务没启动或端口不对 | 启动服务;检查port是否正确 |
| ping 提示 NOAUTH Authentication required | 服务端设置了requirepass | 用redis-cli -a 密码 连接 |
| 外部机器连接不上,本机可以 | bind限制或protected-mode拦截 | 改bind 0.0.0.0,设置密码,按需关保护模式 |
| 写数据后重启丢失 | 持久化没配置 | 配置RDB或AOF,确保dir目录可写 |
| 内存占用一直涨 | 没设置maxmemory | 设置maxmemory和maxmemory-policy |
| 6379端口被占用 | 别的进程占用了 | netstat/lsof查看进程ID,杀掉或改Redis端口 |
再补一个可视化客户端的建议。刚装完Redis,用命令行验证没问题之后,我建议装一个图形化客户端来检查key的情况。官方推荐Redis Insight,社区里还有Another Redis Desktop Manager等选择,按自己习惯选一个就行。连接配置都一样:填主机、端口、密码,能连上,说明你的安装和配置就彻底验证通过了。
最后分享一个小绝招:无论是Windows、Mac还是Docker里,以后只要不确定Redis服务有没有正常起,最快最直接的办法就是redis-cli ping。返回PONG,就说明服务链路通了。所有花里胡哨的问题,都可以往"启动、端口、密码、保护模式、持久化目录"这五个维度去查,Redis就没有解决不了的问题。
我个人实际部署下来的体会是:Redis装起来不难,难的是大部分人第一次遇到的问题都出在"环境假设"上。比如以为Windows可以直接跑最新版,以为brew一定装得上,以为改了配置文件就一定会被加载。只要把方案选型、配置文件路径、启动方式这三个关键点搞清楚,Windows和Mac其实就是同一件事,只是入口不同。这篇文章里写的都是我这些年亲手踩过的坑,按这个流程操作,至少能让你少走一两个星期的弯路。后面等你再装MySQL、Elasticsearch、消息队列这些中间件的时候,你会发现很多排查思路完全是通用的,到时候用这套方法论去定位问题,你会感谢Redis帮你练出来的手感。