How to set TTL on Rocks DB properly?

泄露秘密 提交于 2020-01-05 03:52:11

问题


I am trying to use Rocks DB with TTL. The way I initialise rocks db is as below: options.setCreateIfMissing(true).setWriteBufferSize(8 * SizeUnit.KB) .setMaxWriteBufferNumber(3) .setCompressionType(CompressionType.LZ4_COMPRESSION).setKeepLogFileNum(1); db = TtlDB.open(options, this.dbpath, 10, false);

I have set TTL to 10 seconds. But, the key value pairs are not being deleted after 10 seconds. Whats happening here?


回答1:


That's by design:

This API should be used to open the db when key-values inserted are meant to be removed from the db in a non-strict 'ttl' amount of time therefore, this guarantees that key-values inserted will remain in the db for at least ttl amount of time and the db will make efforts to remove the key-values as soon as possible after ttl seconds of their insertion

-- from the RocksDB Wiki-page on TTL.

That means values are only removed during compaction, and staleness is not checked during reads.

One of the good things about RocksDB is that their source is quite readable. The files you would want to look at are the header and source for TtlDb. In the header you will find the compaction which removes stale values (the compaction's Filter-contract is documented well in its header). In the TtlDb source you verify for yourself that Get does not do any checks whether or not the value is stale. It just strips the timestamp (which just gets appended to the value on insert).



来源:https://stackoverflow.com/questions/53699784/how-to-set-ttl-on-rocks-db-properly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!