2017-10-01 1 views
2

아래의 코드를 사용하면 db에 하나의 항목 만있을 것으로 예상됩니다. 이동을 위해 syndtr/goleveldb LevelDB 구현을 사용합니다.중복 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) 
    } 
} 

대신, 16 진 덤프는 5 개 항목이 있음을 알 수있다.

값이 덮어 쓰기됩니다 때 제어 할 수 있습니다 또는 어떻게 (I db.Put(key)? 는 compaction이와 아무 상관이 있나요마다 db.Has(key)을 확인 이외의 오류를 얻을 수있는 방법

?

답변

1

이 LevelDB 인 log-structured merge-tree 및 .

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

가 어떻게 일을 제어 할 수 있습니다 : 당신은 단지 하나의 값이 키에 대한 존재 함을 확인할 수있는이 코드를 사용하여 트랜잭션 로그를 (사람은 당신이 16 진 덤프로 검사하고)있다 e 값이 덮어 쓰기됩니까?

키가 존재하는 경우, 그 값은

을 덮어 쓰기됩니다 수 없습니다
관련 문제