我正在尝试将Rocks DB与TTL一起使用。我初始化rock 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秒后删除。这是怎么回事?
答案 0 :(得分:1)
那是设计使然:
当要在非严格的“ ttl”时间内从数据库中删除插入的键值时,应使用此API打开数据库,从而保证插入的键值将保留在数据库中在至少ttl的时间内,数据库将努力在插入ttl秒后尽快删除键值
-来自TTL上的RocksDB Wiki-page。
这意味着仅在压缩期间删除值,并且在读取期间不检查陈旧性。
RocksDB的优点之一是其源代码易于阅读。您要查看的文件是TtlDb
的{{3}}和header。在标题中,您会找到消除陈旧值的压缩(压缩的Filter
合同在source中有很好的记录)。在TtlDb
源中,您自己验证Get
不会进行任何检查值是否陈旧。它只是剥离时间戳(时间戳会被附加到插入值上)。