嵌入式磁盘版的redis(比redis快20倍)

💡 原文中文,约6600字,阅读约需16分钟。
📝

内容提要

wedb_embed 是一款基于 LSM-Tree 的嵌入式磁盘数据库引擎,兼容 Redis 数据结构与接口,性能优于 Redis 且内存占用低。它支持多租户、多库隔离及崩溃一致性,采用双分区存储与紧凑编码优化。该引擎专为单线程单核心异步运行时设计,通过栈上分配与无锁并发减少开销,适用于边缘计算与微服务场景。

🔎

延伸解读

性能倍率差异的根源

文章实测显示,wedb_embed 在 Apple M2(NVMe SSD)上综合性能约为 Redis 的 40 倍,而在 GitHub Actions(云端虚拟磁盘)上约为 20 倍。这种差异主要源于底层磁盘硬件的 I/O 吞吐与读写延迟。因此,实际性能提升高度依赖存储介质,在普通机械硬盘或网络存储上,性能优势可能大幅缩水。

内存占用对比的启示

在 5GB 结构化数据实测中,Redis 物理内存占用达 4814 MB,而 wedb_embed 仅 334 MB,降低 93%;落盘体积也由 Redis AOF 的 7652 MB 压缩至 1180 MB。这得益于 LSM-Tree 的块压缩与内存预算控制,但需注意 cache_size 默认 512MB,实际内存占用会受此参数影响。

适用场景与限制

wedb_embed 专为单线程单核心异步运行时设计,强调栈上分配与无锁并发,适合边缘计算、命令行工具等嵌入式场景。但它是磁盘数据库,性能受磁盘 I/O 制约,且要求 Rust 环境集成,可能不适合需要多线程高并发或跨语言部署的现有 Redis 用户。

Q&A

wedb_embed 是什么?它与 Redis 有什么关系?

wedb_embed 是一个基于 LSM-Tree 的嵌入式磁盘数据库引擎,兼容 Redis 的数据结构和接口。它类似于 SQLite 在关系型数据库中的地位,将存储引擎直接嵌入应用程序进程,无需独立服务器,数据持久化到本地磁盘文件。

wedb_embed 的性能比 Redis 快多少?为什么会有差异?

在 Apple M2(NVMe SSD)上实测综合性能约为 Redis 的 40 倍,在 GitHub Actions(Linux 云端虚拟磁盘)上约为 20 倍。性能差异主要源于底层磁盘硬件的 I/O 吞吐和读写延迟不同。

wedb_embed 如何控制内存占用?相比 Redis 能节省多少内存?

常驻内存由 cache_size(默认 512MB 块缓存)和 max_memtable_size 参数控制,不随数据量线性增长。在 5GB 结构化数据实测中,Redis 物理内存占用 4814 MB,而 wedb_embed 仅 334 MB,降低了 93%。

wedb_embed 支持哪些 Redis 数据结构?

支持 16 种 Redis 兼容数据模型,包括 String、Hash(支持字段级 TTL)、List、Set、ZSet、Bitmap、JSON、Bloom/Cuckoo 过滤器、TimeSeries、Geo、HyperLogLog、TDigest、SortedInt、Stream、全文检索和 HNSW 向量检索。

wedb_embed 如何保证崩溃一致性?

通过预写日志(WAL)和跨分区原子批处理(WriteBatch)来保障断电或异常退出时的数据完整性。

wedb_embed 的多租户和多数据库隔离是如何实现的?

原生支持 2^64 个独立租户和数据库。命名空间(ns)和数据库(db)传入 None 时自动分配递增编号并创建新实例。物理存储上通过 KeyComposer 编码为 \x00[oppv(ns_id)][oppv(db)] 前缀实现隔离。

wedb_embed 的存储架构有什么特点?

采用双分区物理存储:数据分区(data)存储原始值和子键,使用 8KB 块和 LZ4 压缩;元数据分区(meta)存储元数据和目录,使用 4KB 块和内存哈希索引。还采用 1 字节紧凑标签和 OPPV 变长整数编码优化存储和扫描。

wedb_embed 为什么适合单线程单核心异步运行时?

它针对基于 io_uring 的 Thread-per-Core 模型设计,利用栈上分配(SmallKey 64B)避免堆分配,线程绑定核心保持 CPU 缓存局部性,使用无锁并发和同步调用减少开销,从而提升性能。

🏷️

标签

➡️

继续阅读