技术札记

我在 Homebrew Redis 8.10.0 中发现了一个打包问题

一次 Redis 本地启动失败的排查记录:默认配置启用了四个模块,但 Homebrew bottle 中没有对应动态库。

HOUHUIYANG.COM

扫码继续阅读

正在生成…

我在 Homebrew Redis 8.10.0 中发现了一个打包问题

houhuiyang.com/zh/notes/homebrew-redis-8-10-missing-modules-bug

最近我通过 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,或采用明确包含所需模块的安装方案。

这次排查带来的提醒

遇到服务启动失败时,不要只重复执行安装和重启命令。更有效的排查顺序是:

  1. 检查服务的真实状态和退出码;
  2. 以前台方式启动,读取直接错误;
  3. 对照配置声明与安装产物;
  4. 做最小修改验证因果关系;
  5. 整理可复现步骤并反馈给上游。

开源贡献不一定从提交代码开始。一份边界清楚、证据完整、能够稳定复现的 Bug 报告,同样可以帮助维护者更快定位问题。

参考

返回技术札记