关于 Rocksdb 删除数据但之后迭代器仍然迭代旧数据的问题

A problem about Rocksdb deleting data but after that iterator still iterate old data

我在使用 pyrocksdb 开发系统时做了一个实验来找出 rocksdb 的问题。我试过下面的代码:

def func(iterator):
     for k, v in iterator:
             print("k:{}, v:{}".format(k, v))

import rocksdb
db = rocksdb.DB("test.db", rocksdb.Options(create_if_missing=True))
batch = rocksdb.WriteBatch()
batch.put(b'a1', b'data1')
batch.put(b'a2', b'data2')
batch.put(b'a3', b'data3')
db.write(batch)
it = db.iteritems()
it.seek_to_first()
func(it)

#print info
k:b'a1', v:b'data1'
k:b'a2', v:b'data2'
k:b'a3', v:b'data3'

#delete a kv
db.delete(b'a1')
it.seek_to_first()
func(it)

#print info, k:b'a1', v:b'data1' is still available
k:b'a1', v:b'data1'
k:b'a2', v:b'data2'
k:b'a3', v:b'data3'

#but if I reassign it
it = db.iteritems()
it.seek_to_first()
func(it)

#print info, delete takes effect
k:b'a2', v:b'data2'
k:b'a3', v:b'data3'

我想弄清楚为什么我需要重新分配迭代器?

原因:

  • 首先调用了db.iteritems(),返回值存放在 it.
  • 即使在您使用 db.delete(b'a1') 删除后,信息 存储在 it 中未更新。和以前一样。
  • 但是要检查,您需要再次更新 it 的信息 通过 it = db.iteritems().
  • 变量(你在上一个案例中已经完成)
  • 现在 it 变量已更新,您可以看到数据被删除为 嗯。

解法:

创建一个函数来执行该重复性任务,您可以在需要打印数据时调用它。

def update_func():
    it = db.iteritems()
    it.seek_to_first()
    func(it)

update_func()