我正在尝试将 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);
我已将 TTL 设置为 10 秒。但是,10 秒后键值对不会被删除。这里发生了什么事?
这是设计使然:
当插入的键值要在非严格的“ttl”时间内从数据库中删除时,应使用此 API 打开数据库,因此,这保证插入的键值将至少保留在数据库中ttl 时间量,数据库将在插入 ttl 秒后尽快删除键值
- 来自RocksDB 维基页面 https://github.com/facebook/rocksdb/wiki/Time-to-Live在 TTL 上。
这意味着仅在压缩期间删除值,并且在读取期间不检查陈旧性。
RocksDB 的优点之一是它们的源代码非常可读。您想要查看的文件是header https://github.com/facebook/rocksdb/blob/master/utilities/ttl/db_ttl_impl.h and source https://github.com/facebook/rocksdb/blob/master/utilities/ttl/db_ttl_impl.cc for TtlDb
。在标题中,您将找到删除陈旧值的压缩(压缩的Filter
- 合同有详细记录它的标题 https://github.com/facebook/rocksdb/blob/master/include/rocksdb/compaction_filter.h)。在里面TtlDb
来源您自己验证Get
不做任何检查该值是否过时。它只是删除时间戳(它只是附加到插入时的值)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)