# RocksDB：写

![`smart`](RocksDBWrite01_aa_002_20220511.png)

------------------------------------------------------------------------------
RocksDB是一种使用日志结构合并（LSM）树数据结构存储数据的键值存储引擎。 LSM树允许RocksDB通过将数据批量存储在内存中并将其写入磁盘来有效处理数据插入、修改和删除操作。 LSM树结构跨越内存和磁盘，由MemTable、不可变MemTable和SSTable等几个组件组成。

当执行写操作时，RocksDB首先将数据写入`write-ahead logging`（WAL）文件，以确保内存丢失时的持久性。然后，数据将写入MemTable，这是一种内存数据结构，用于保存Flush操作的数据。MemTable使用数据结构（如跳跃列表或搜索树）对数据进行组织，以保持其组织状态。MemTable既用于读取，也用于写入；新的写操作总是将数据插入MemTable，而读操作总是在查询磁盘上的SSTable之前查询MemTable，因为MemTable中的数据总是最新的。

当MemTable达到一定大小（由write_buffer_size参数控制）时，它将被转换为不可变的MemTable以准备将其写入磁盘。这样做是为了在转换过程中继续进行写操作而不被阻塞。然后，创建一个新的MemTable来处理新到达的数据，而后台线程将前一个不可变的MemTable的内容写入磁盘上的SSTable文件。一旦数据被写入，MemTable及其关联的WAL文件可以被删除。默认情况下，一个不可变的MemTable触发一次磁盘写操作，五个不可变的MemTable触发一次写停顿。

sync-log = true 表明写入操作将调用 fsync 并将 WAL 日志文件持久化到磁盘而不是操作系统缓存中。


