2017-10-01 1 views
2

Lorsque j'utilise le code suivant ci-dessous, je prévois n'avoir qu'une entrée dans la base de données. J'utilise l'implémentation LevelDB syndtr/goleveldb pour Go.Erreur d'écrasement/de lancement sur une clé en double dans Go LevelDB

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

Au lieu de cela, un hexdump révèle qu'il ya 5 entrées:

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 

De ma compréhension LevelDB devrait par défaut remplacer une clé en double ou au moins une erreur.

Comment puis-je contrôler quand la valeur est écrasée ou comment puis-je obtenir une erreur (autre que la vérification db.Has(key) chaque fois que je db.Put(key)? Est-ce que compaction rien à voir avec cela?

Répondre

1

LevelDB est un log-structured merge-tree et a les journaux de transactions (ceux que vous inspectaient avec hexdump) avec ce code, vous pouvez vérifier que seule valeur est présente pour votre clé:.

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() 
} 

Comment puis-je contrôler quand e La valeur est-elle écrasée?

Vous ne pouvez pas, si la clé est présente, sa valeur est écrasée