Redis Open Source 8.10 源码编译:make bootstrap 与 CMake 3.31.6 上限
项目信息
- 仓库:github.com/redis/redis
- 官网/文档:redis.io、redis.io/docs/latest
- 8.10 公告:Announcing Redis 8.10 — compact hash, JSONPath extensions, performance improvements and more
- What's new:redis.io/docs/latest/develop/whats-new/8-10
- Release notes:00-RELEASENOTES、releases/tag/8.10.0
- Docker:hub.docker.com/_/redis
- 二进制分发:redis-snap、homebrew-redis、redis-rpm、redis-debian
Redis Community Edition 自 v8.0 起改名为 "Redis Open Source"。
8.10 的关键变化
Compact hashes(压缩哈希 / hash templates)换了新的哈希编码,把共享同一 schema 的字段名只存一次,官方给出的数字是同类结构化哈希工作负载内存最多减少 50%。配套的新命令 HIMPORT 用于高吞吐批量插入压缩哈希,字段名不再逐条发送和解析,加载吞吐最高提升 2 倍。
增量备份与恢复引入了 BACKUP 命令族,基于 multi-part AOF(MP-AOF)。每个备份从一个时间点的 RDB 快照(BASE)开始,备份窗口保持打开期间把后续写入记进增量(INCR)AOF 文件;seal 时 RDB 快照 + 增量 AOF + manifest 构成完整备份。seal 不需要再 fork 一次,各分片的快照时间可以错开、最后一起 finalize。恢复走新的 preload-file 启动选项,可加载 sealed backup manifest 或独立 RDB 文件。
其余新增能力:
- TLS 对端证书认证(server-to-server)。
- LMOVEM、BLMOVEM:一次原子移动多个 list 元素。
- SUNIONCARD、SDIFFCARD:不物化结果就拿到多个 set 的并集/差集基数,对应已有的 SINTERCARD。
- XREAD / XREADGROUP 新增 MAXCOUNT 和 MAXSIZE,限制跨所有 Stream 返回的消息总条数与回复总字节数。
- FT.ALIASLIST 获取索引的所有别名;FT.AGGREGATE 新增 COLLECT reducer,区分远端/本地 reducer 调用。
- FT.SEARCH / FT.AGGREGATE / FT.HYBRID 对 query TIMEOUT 执行更严格:FAIL 必须拒绝超时查询;RETURN 可接受尽力而为的部分结果、后处理阶段不强制严格;RETURN_STRICT 可接受部分结果但后处理阶段强制严格。新增 search-timeout 参数。
- JSONPath 扩展了算术与比较运算符、in/nin 与过滤取反、字符串函数 match()/search()/concat()、数组函数 first()/last()/append()/index()、聚合 min()/max()/avg()/sum()/stddev()、length()/count()/keys()/value() 等。
- Time Series 新增 TS.NRANGE / TS.NREVRANGE(跨多条时序按时间戳分组查询)、TS.READ(可选阻塞读)、TS.QUERYLABELS;TS.MRANGE/TS.MREVRANGE 新增 EXCLUDEEMPTY。
- Search 新增马来语、塔加洛语词干支持。核心 / Search / JSON 有性能与资源占用优化。
编译链的破坏性变化
8.10 起构建说明与 8.8 不同,旧版本看 8.8 的构建说明。
要编译全部数据结构(JSON、time series、Bloom/cuckoo/count-min/top-k、t-digest、Query Engine),需要 GCC/Clang、LLVM 21、CMake 3.25–3.31.6、Rust 1.94、OpenSSL、Python 3 以及各种 -dev 库。仓库现在用 make bootstrap 自动检测操作系统并安装各捆绑模块的前置依赖,不再逐个 OS 列包清单。
CMake 是硬门槛:模块要求 3.25 ≤ CMake ≤ 3.31.6,CMake 4.x 不支持,用它构建会失败。默认自带 CMake 4.x 的发行版(例如 Ubuntu 26.04)得自己钉住版本:
pip3 install 'cmake==3.31.6'
make bootstrap 只在 CMake 缺失或过旧时安装,不会把已装的 4.x 降级。查看缺什么用 make bootstrap list,它会打印 core 与所有模块去重后的缺失依赖,版本门槛显示为 name (>= X)。要拿可复制的安装命令用 make bootstrap dry-run,只打印、不安装;命令按模块打印,共享依赖会重复出现,边装边重跑直到无输出。
推荐在 Docker 里构建,仓库提供 docker/Dockerfile.noble(Ubuntu 24.04),依赖已内置:
docker build -f docker/Dockerfile.noble -t redis-build:noble .
# 多架构
docker buildx build --platform linux/amd64,linux/arm64 -f docker/Dockerfile.noble -t redis-build:noble .
# 挂载工作目录构建
docker run --rm -it -v "$PWD":/workspace -w /workspace redis-build:noble bash -lc 'make -j"$(nproc)" && make run'
make bootstrap 会安装系统包,可能覆盖已有的编译器/CMake/LLVM 版本,介意就别在本机跑。
测试覆盖的系统:Ubuntu 22.04/24.04/26.04;Rocky Linux 8.10/9.7/10.1;AlmaLinux 8.10/9.7/10.1;Debian 12.13(Bookworm)/13.4(Trixie);Alpine 3.23;macOS 14.8.4/15.7.4/26.3(Intel 与 ARM)。
redis.conf 与 redis-full.conf
发布 tarball 已捆绑模块源码:
wget -O redis-8.10.0.tar.gz https://github.com/redis/redis/releases/download/8.10.0/redis-full.tar.gz
tar xvf redis-8.10.0.tar.gz && cd redis-8.10.0
git checkout 需要先拉一次捆绑模块:
git clone https://github.com/redis/redis.git && cd redis && make modules-update
两者的配置文件不同。发布 tarball 在打包时把捆绑模块的 loadmodule 行和各模块设置直接写进 redis.conf,解压即可 ./src/redis-server redis.conf;从 git checkout 构建时,模块配置在 make modules-update(以及 make sync-redis-conf 重新生成)产出的 redis-full.conf 里,应跑 ./src/redis-server redis-full.conf。Redis 核心设置改 redis.conf,模块配置流程见 modules/MODULES.md。
构建与安装:
export BUILD_TLS=yes
make -j "$(nproc)" # 连同 modules/*/src 一起构建
make build redis # 只构建核心
make install PREFIX=/usr/local
sudo make install SKIP_BUILD=1
make install PREFIX=/usr/local 会把 redis-server/redis-cli/redis-benchmark 和三个 symlink 装到 $PREFIX/bin,各模块 .so 装到 $PREFIX/lib/redis/modules,并重写生成配置里的 loadmodule 路径。DESTDIR 用于打包暂存,PROG_SUFFIX 生成带后缀程序名。
典型报错是 redis-server 起不来,报 "Error loading the extension" 或打不开某个 .so。原因是配置里仍列着没能成功构建的模块——发布 tarball 的 redis.conf 为每个捆绑模块都带 loadmodule 行,构建失败的模块不会留下 .so。要么把它构建出来(make bootstrap && make,或 make build ),要么在传的配置里把非核心的 loadmodule 行连同该模块自己的设置(search-、ts-、bf-、json-)都注释掉。纯核心方案:不带配置文件直接 ./src/redis-server,或在 git checkout 下 make build redis && ./src/redis-server redis.conf,那里的 redis.conf 没有模块块。
许可证与 Intel Leanvec/LVQ
许可证按版本分档:7.2.x 及更早 = BSD-3-Clause;7.4.x–7.8.x = RSALv2 或 SSPLv1 二选一;8.0.x 起 = RSALv2 / SSPLv1 / AGPLv3 三许可任选。
如果按 AGPLv3 或 SSPLv1 使用 Redis Open Source,不能与 Intel Optimizations(Leanvec 与 LVQ 二进制)一起用,因为 Intel SVS 的许可证与这两者不兼容。Leanvec/LVQ 是闭源的,只有在 RSALv2 许可下才能与 Redis Open Source 一起分发。参考 intel/ScalableVectorSearch。
边界
- HIMPORT、LMOVEM/BLMOVEM、SUNIONCARD/SDIFFCARD、BACKUP、TS.* 等命令是 8.10 首次引入,不能向后移植。
- 增量备份 BACKUP 是节点侧实现,与 MP-AOF 绑定,不是通用的跨版本备份格式;恢复依赖 preload-file 启动项。
- 从源码编译全模块的依赖链较重且版本敏感,生产环境优先用官方 Docker 镜像或发行版包,源码编译主要给需要定制/打补丁的场景。