2017-10-01 16 views
2

以下のコードを使用している場合、dbには1つのエントリしか存在しません。 GoのLevelDBの実装はsyndtr/goleveldbです。Go LevelDBの重複キーの上書き/スローエラー

00000000 a8 ef d2 d4 17 00 01 01 00 00 00 00 00 00 00 01 |................| 
00000010 00 00 00 01 03 6b 65 79 05 76 61 6c 75 65 10 23 |.....key.value.#| 
00000020 44 b5 17 00 01 02 00 00 00 00 00 00 00 01 00 00 |D...............| 
00000030 00 01 03 6b 65 79 05 76 61 6c 75 65 77 be 34 95 |...key.valuew.4.| 
00000040 17 00 01 03 00 00 00 00 00 00 00 01 00 00 00 01 |................| 
00000050 03 6b 65 79 05 76 61 6c 75 65 08 35 86 60 17 00 |.key.value.5.`..| 
00000060 01 04 00 00 00 00 00 00 00 01 00 00 00 01 03 6b |...............k| 
00000070 65 79 05 76 61 6c 75 65 6f 8c f6 00 17 00 01 05 |ey.valueo.......| 
00000080 00 00 00 00 00 00 00 01 00 00 00 01 03 6b 65 79 |.............key| 
00000090 05 76 61 6c 75 65         |.value| 
00000096 

私の理解LevelDBからデフォルトですべての重複したキーを上書きするか、少なくともエラーをスローする必要があります

for count := 0; count < 5; count++ { 
    err := db.Put([]byte("key"), []byte("value")) 
    if err != nil { 
     t.Error(err) 
    } 
} 

代わりに、hexdumpに対しては5つの項目があることが明らかになりました。

値が上書きされますまたはどのように私はdb.Has(key)に私db.Put(key)compactionはこれを行うには何も持っていますか?

答えて

1

LevelDBはlog-structured merge-treeとあるたびにチェックする以外(エラーを取得することができたときにどのように制御することができます。このコードを使用すると、一つの値だけがあなたの鍵のために存在していることを検証することができ、トランザクションログ(あなたはhexdumpに対してで検査されたもの)があります。

package main 

import ("fmt" 
"github.com/syndtr/goleveldb/leveldb" 
) 

func main() { 
     db, err := leveldb.OpenFile("mydb.test", nil) 
     if err != nil { fmt.Println(err) } 

     for count := 0; count < 5; count++ { 
       err := db.Put([]byte("keys"), []byte("values"), nil) 
       if err != nil { 
        fmt.Println(err) 
       } 
     } 

     iter := db.NewIterator(nil, nil) 
     for iter.Next() { 
       key := iter.Key() 
       value := iter.Value() 
       fmt.Println(string(key), string(value)) 
     } 
     iter.Release() 

     defer db.Close() 
} 

番目どのように制御することができますe値は上書きされますか?

キーが存在する場合、キーの値が上書きされません。