
# 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）。
 
#### 主要原因
1. 磁盘压缩与内存解压 SST文件在磁盘上存储时通常采用压缩算法以减少磁盘空间使用，但在Block Cache中，数据被存储为解压后的原始格式以便于快速查询。因此，相同的逻辑数据在Block Cache中的内存占用会显著高于磁盘中压缩存储的体积。这个现象在缓存大量数据的情况下尤为明显。
   
2. Block Cache采用惰性淘汰策略 Block Cache采用 LRU（Least Recently Used） 策略进行淘汰和管理缓存内容。只有当 Block Cache 使用量达到配置上限时，才会触发淘汰逻辑，移除最久未被访问的数据块。在内存未满的情况下，即使某些key被更新或删除（且包含这些数据的旧SST文件尚未被compaction清理），这些块仍会保留在Block Cache中，导致内存占用持续上升。
   
GeminiDB Redis的内存占用大于磁盘容量主要源于SST文件的压缩与解压逻辑，以及Block Cache的缓存策略（惰性淘汰机制）。这两个因素共同作用可能导致系统整体内存占用大于磁盘数据容量。
