LevelDB
使用场景 持久化缓冲队列(削峰) LevelDB 可以作为持久化写缓冲使用,实现「一边写入、一边读出」的管道模式: 写入端(Producer):将数据以递增的序列号或时间戳作为 Key 写入 LevelDB,得益于 LSM-Tree 架构,写入速度极快(顺序写磁盘),可以吸收突发流量峰值 读取端(Consumer):按 Key 顺序扫描读取,处理完毕后删除对应记录,以自身能处理的速率消费数据 数据持久化到磁盘:与纯内存队列不同,LevelDB 的数据落盘,进程崩溃后数据不丢失,重启后可继续消费 这种模式可以起到削峰填谷的作用:写入端的流量高峰被 LevelDB 缓冲到磁盘,读取端按匀速消费,避免下游系统因瞬间流量过大而崩溃。 适合此场景的条件 数据量超出内存容量,需要落盘缓冲 对消息顺序有要求(LevelDB Key 有序) 单机嵌入式场景,不想引入 Kafka/RabbitMQ 等重量级中间件 可以接受 LevelDB 不提供原生队列语义(需要自行管理消费位点和删除逻辑) 注意事项 LevelDB 不是消息队列,没有 ACK、重试、多消费者等内置机制,需要自行实现 频繁删除已消费数据会触发 Compaction,建议批量删除 如果对高吞吐、多消费者、分布式有需求,优先考虑 Kafka 等专用消息队列 其他典型场景 本地缓存层:缓存热点数据到本地磁盘,减少远端数据库访问 索引存储:存储倒排索引、元数据索引等有序 KV 数据 嵌入式数据库:Chrome 浏览器使用 LevelDB 存储 IndexedDB 数据 区块链节点:比特币、以太坊节点使用 LevelDB 存储区块链状态数据 LevelDB 数据写入流程 数据写入的整个流程为: 数据首先会被写入 memtable 和 WAL 当 memtable 达到上限后,会转换为 immutable memtable,之后持久化到 L0 (称为 flush),L0 中每个文件都是一个持久化的 immutable memtable,多个文件间可以有相互重叠的 Key 当 L0 中的文件达到一定数量时,便会和 L1 中的文件进行合并 (称为 compaction) 自 L1 开始所有文件都不会再有相互重叠的 Key,并且每个文件都会按照 Key 的顺序存储。每一层通常是上一层大小的 10 倍,当一层的大小超过限制时,就会挑选一部分文件合并到下一层 ...