最近我通过 Homebrew 安装 Redis 8.10.0,用于本地开发:
brew install redis
brew services start redis
安装过程没有报错,Homebrew 也提示服务已经启动,但 brew services list 中 Redis 的实际状态却是:
redis error 1
这不是 Redis 本身无法运行,而是 bottle 中的默认配置和实际文件不一致。我已经将问题提交到 Homebrew: Homebrew/homebrew-core#296698。截至 2026 年 8 月 11 日,Issue 仍处于 Open 状态。
问题在哪里
bottle 提供的 redis.conf 默认启用了四个模块:
loadmodule ./modules/redisbloom/redisbloom.so
loadmodule ./modules/redisearch/redisearch.so
loadmodule ./modules/redisjson/rejson.so
loadmodule ./modules/redistimeseries/redistimeseries.so
但检查安装目录后,没有找到任何对应的 .so 或 .dylib 文件。Redis 启动时读取这些指令,无法加载不存在的模块,于是直接退出。
这类故障容易产生误导:包管理器显示“Successfully started”,只代表服务管理命令已经提交,不代表 Redis 进程最终健康运行。
如何确认
我分别检查了配置和安装产物:
grep -n "loadmodule.*modules" \
/opt/homebrew/Cellar/redis/8.10.0/.bottle/etc/redis.conf
find /opt/homebrew/Cellar/redis/8.10.0 \
-type f \( -name "*.so" -o -name "*.dylib" \)
第一条命令能够看到四条已启用的 loadmodule,第二条命令却找不到模块动态库。配置声明与实际产物不一致,这就是问题的直接证据。
临时处理
如果本地开发并不依赖这些模块,可以暂时注释对应配置,再重启 Redis:
sed -i '' \
-e 's|^loadmodule ./modules/|#loadmodule ./modules/|' \
/opt/homebrew/etc/redis.conf
brew services restart redis
redis-cli ping
恢复后,redis-cli ping 返回:
PONG
这只是临时绕过,不是上游正式修复。如果业务依赖 RedisBloom、RediSearch、RedisJSON 或 RedisTimeSeries,就不能简单禁用它们,而应等待 Homebrew 修正 bottle,或采用明确包含所需模块的安装方案。
这次排查带来的提醒
遇到服务启动失败时,不要只重复执行安装和重启命令。更有效的排查顺序是:
- 检查服务的真实状态和退出码;
- 以前台方式启动,读取直接错误;
- 对照配置声明与安装产物;
- 做最小修改验证因果关系;
- 整理可复现步骤并反馈给上游。
开源贡献不一定从提交代码开始。一份边界清楚、证据完整、能够稳定复现的 Bug 报告,同样可以帮助维护者更快定位问题。