如何正确设置Rocks DB上的TTL?

Nir*_*ina 2 ttl rocksdb

我正在尝试将 Rocks DB 与 TTL 结合使用。我初始化rocks db的方式如下:

 options.setCreateIfMissing(true)
   .setWriteBufferSize(8 * SizeUnit.KB)
   .setMaxWriteBufferNumber(3) 
   .setCompressionType(CompressionType.LZ4_COMPRESSION)
   .setKeepLogFileNum(1);

db = TtlDB.open(options, this.dbpath, 10, false);
Run Code Online (Sandbox Code Playgroud)

我已将 TTL 设置为 10 秒。但是,10 秒后键值对不会被删除。这里发生了什么事?

mid*_*dor 5

这是设计使然:

当插入的键值要在非严格的“ttl”时间内从数据库中删除时,应使用此 API 打开数据库,因此,这保证插入的键值将至少保留在数据库中ttl 时间量,数据库将在插入 ttl 秒后尽快删除键值

——摘自TTL 上的RocksDB Wiki 页面

这意味着仅在压缩期间删除值,并且在读取期间不检查陈旧性。

RocksDB 的优点之一是它们的源代码非常可读。您想要查看文件. TtlDb在标头中,您将找到删除陈旧值的压缩(压缩的合同在其标头Filter中有详细记录)。在您自己验证的源中,不会执行任何检查该值是否已过时。它只是删除时间戳(它只是附加到插入时的值)。TtlDbGet