GeminiDB Redis为什么会出现内存占用大于磁盘数据容量的情况?
基础知识
GeminiDB Redis是基于RocksDB构建的高性能键值(KV)存储系统。RocksDB将全量数据以SST(Sorted String Table)文件的形式持久化到磁盘,写入操作首先写入内存中的MemTable,达到阈值后MemTable会转为不可变MemTable,并异步flush成SST文件。
为了提高读取性能,RocksDB在内存中维护以下关键结构:
- MemTable:接收新写入的内存表。
- Block Cache:缓存从SST读取的热点数据块(data block)、索引块(index block)和布隆过滤器(filter block)。
主要原因
- 磁盘压缩与内存解压
SST文件在磁盘上存储时通常采用压缩算法以减少磁盘空间使用,但在Block Cache中,数据被存储为解压后的原始格式以便于快速查询。因此,相同的逻辑数据在Block Cache中的内存占用会显著高于磁盘中压缩存储的体积。这个现象在缓存大量数据的情况下尤为明显。
- Block Cache采用惰性淘汰策略
Block Cache采用 LRU(Least Recently Used) 策略进行淘汰和管理缓存内容。只有当 Block Cache 使用量达到配置上限时,才会触发淘汰逻辑,移除最久未被访问的数据块。在内存未满的情况下,即使某些key被更新或删除(且包含这些数据的旧SST文件尚未被compaction清理),这些块仍会保留在Block Cache中,导致内存占用持续上升。
GeminiDB Redis的内存占用大于磁盘容量主要源于SST文件的压缩与解压逻辑,以及Block Cache的缓存策略(惰性淘汰机制)。这两个因素共同作用可能导致系统整体内存占用大于磁盘数据容量。

