2

我正在使用 RocksDB Java JNI,并希望在将新条目添加到 RocksDB 时获取它们。

Thread t = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                try {
                    System.out.println("Putting " + i);
                    rocksDB.put(("key " + i).getBytes(), ("value " + i).getBytes());
                    Thread.sleep(100);
                } catch (InterruptedException | RocksDBException e) {
                    e.printStackTrace();
                }
            }
        }, "Putting thread");
        t.start();

       Thread.sleep(1000); // wait for sometime

       ReadOptions readOptions = new ReadOptions();
       readOptions.setTailing(true);
       try (RocksIterator rocksIterator = rocksDB.newIterator(readOptions)) {
            for (rocksIterator.seekToFirst(); rocksIterator.isValid(); rocksIterator.next()) {
                System.out.println(new String(rocksIterator.key()) + " = " + new String(rocksIterator.value()));
            }
        }
        t.join();

在这里,我想它是在那个时刻(即之后)创建一个快照1 sec,并且只有那些添加的元素才会被打印出来。我预计尾随迭代器应该被阻塞,因为将添加新条目。

有没有关于如何在 RocksDB 中使用尾迭代器的示例?

4

1 回答 1

0

拖尾迭代器不是阻塞的,它只是意味着迭代器在创建后可以获得新的更新。与普通迭代器相比,获取当前数据的快照:在迭代器创建后添加的新数据将不包括在内。

auto trailing_it = rocksDB.newIterator(readOptions);
auto normal_it = rocksDB.newIterator(new ReadOptions());
rocksDB.put("new_data", "added_after_iterator_creation");
ASSERT(trailing_it.isValid());  // iterator has the new added data
ASSERT(!normal_it.isValid());   // doesn't have the new added data

对于实现细节:普通迭代器使用当前序列号对数据进行快照,新数据将不会被包含在内,因为它们具有更大的序列号。尾随迭代器使用 a MaxSequenceNumber,它将包括任何新添加的数据。

于 2020-09-11T20:06:27.717 回答