【问题标题】:How to use RocksDB tailing iterator?如何使用 RocksDB 尾随迭代器?
【发布时间】:2020-07-08 16:04:01
【问题描述】:

我正在使用 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 中使用尾迭代器的示例?

【问题讨论】:

    标签: java rocksdb rocksdb-java


    【解决方案1】:

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

    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
    

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

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2020-02-18
      • 2014-03-26
      • 1970-01-01
      相关资源
      最近更新 更多