我正在尝试将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秒后不会被删除。这是怎么回事?
发布于 2018-12-12 08:08:07
这是经过设计的:
当插入的键值意味着要在非严格的“ttl”时间量内从数据库中移除时,应使用此API来打开数据库。因此,这保证了所插入的键值将在数据库中保留至少ttl时间量,并且数据库将努力在插入键值的ttl秒之后尽快移除键值。
--来自TTL上的RocksDB Wiki-page。
这意味着仅在压缩期间删除值,并且在读取期间不检查过时。
关于RocksDB的好处之一是它们的源代码非常易读。您需要查看的文件是用于TtlDb的header和source。在标题中,您可以找到压缩,它删除了陈旧的值(压缩的Filter-contract在its header中有很好的说明)。在TtlDb源代码中,您自己验证Get不执行任何值是否过时的检查。它只是剥离时间戳(它只是在插入时附加到值上)。
https://stackoverflow.com/questions/53699784
复制相似问题