簡體   English   中英

關於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 = db.iteritems()來更新it變量的信息(您在上一個案例中已完成it = db.iteritems()
  • 現在it變量被更新了,你可以看到數據也被刪除了。

解決方案:

創建一個函數來執行該重復性任務,您可以在任何時候想要打印數據時調用它。

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

update_func()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM