Engula 是一款高性能、内存高效的 Redis 兼容内核。它基于 Redis Server 代码库构建,在保持协议与行为兼容的前提下,用 Engula 内存引擎 替换了 Redis 的内存对象存储模块,从而让现有 Redis 部署可以更低成本地迁移与验证。
Engula 的架构遵循三条核心原则:
Engula Server 延续 Redis Server 的整体架构,主要改动是将内存对象存储替换为 Engula 内存引擎。其他模块只需少量适配,即可在保留既有 Redis 功能的同时维持兼容性。
在 Redis Server 中,数据访问围绕 Redis Object (robj) 展开。
在 Engula Server 中,内存数据以 Engula Object (eobj) 表示:该结构更紧凑,并针对压缩/解压效率做了专门优化。
在键值操作过程中,Engula 会将 eobj 按需转换为临时的 robj:
robjEngula 通过高度优化的数据结构与编码方式显著降低内存开销。在典型场景下:
| 数据结构 | Redis 开销(字节) | Engula 开销(字节) | 优化点 |
|---|---|---|---|
| HashTable | 32(dictEntry) | 14 | Swiss table |
| Key + robj | 3(key sds)+ 16(robj) | 10 | eobj 存储 |
| Value(String) | 3(value sds) | 1 | eobj 存储 |
| TTL | 8 | 5 | 变长整数编码 |
| Jemalloc | ≥ 4(8 字节对齐) | 2 | Memory Block 管理 |
| 合计 | 66 | 32 | 约 50% 内存降低 |
Engula 将键值数据存储在 Memory Blocks 中,并划分为:
后台任务会周期性地对 Immutable Zone 中的 block 做压缩与替换。这些后台任务会被拆分为细粒度、可中断的协程,并在原生 Redis 的主线程与 I/O 线程中执行。
Engula 会根据系统负载动态调整响应时间预算,优先保障前台请求的延迟目标;后台工作则会根据各 I/O 线程的利用率进行分配,以提升整体 CPU 效率。
Engula 通过额外的 I/O 线程提升多核 CPU 利用率。在多 CPU 环境下,Engula 的 CPU 利用更平滑,读写吞吐更高,同时整体性能保持与 Redis 相当或更优。
Redis(Busy Polling 模型)
Engula(自适应 Signal/Wait 模型)
pthread 条件变量实现的 signal/wait 替代 busy pollingEngula 通过实时压缩/解压,用可控的 CPU 开销换取显著的内存节省,在维持性能的同时降低总体内存成本。
Engula 与 Redis、Valkey 保持 完整的 wire protocol 兼容性。通过复用这些生态的原生计算层,Engula 能为标准数据操作命令提供一致的行为表现。
在存储集成点高度隔离的模块化设计下,Engula 可以在一个月内对齐新的 Redis/Valkey 版本发布,确保兼容性更新节奏。
SAVE/LOAD 耗时,并加速全量复制同步Engula 将 创新的内存管理、强压缩策略 与 协议级互操作性 结合在一起,为 Redis 兼容数据库带来显著提升。
其自适应 I/O 模型与可横向扩展的架构能提供更稳定、更线性的性能表现,并在不牺牲兼容性的前提下实现最高 约 50% 的内存降低,适用于希望降低内存成本且对稳定性要求极高的生产场景。