文档首页/云数据库 GeminiDB/GeminiDB Redis接口/常见问题/数据库使用/GeminiDB Redis为什么会出现内存占用大于磁盘数据容量的情况?
更新时间:2026-02-13 GMT+08:00
分享

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的缓存策略(惰性淘汰机制)。这两个因素共同作用可能导致系统整体内存占用大于磁盘数据容量。

相关文档