关于 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()
我在使用 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()