[Go] badger DB
Go๋ ์ด์ํ๊ฒ ๋ด์ฅํ DB๋ค์ด ๋ง์ ํธ์ธ๋ฐ, badger๋ ๊ทธ ์ค ํ๋๋ค.
LSM ํธ๋ฆฌ ๊ธฐ๋ฐ์ KV DB์ด๋ค.
๋น ๋ฅธ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ฑ๋ฅ์ ์ต๋ ์ฅ์ ์ผ๋ก ๋ด์ธ์ด๋ค. ์ค์ ๋ก๋ ๊ฐ์ฅ ๋น ๋ฅธ ์ถ์ ์ํ๋ ๊ฒ ๊ฐ๋ค.

์ค์น
๋ํ๋์ ํ๋๋ฉด ๋๋ค.
go get github.com/dgraph-io/badger/v4

๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ๋๋ต ์๋์ ๊ฐ๋ค.
package main
import (
"log"
badger "github.com/dgraph-io/badger/v4"
)
func main() {
// Open the Badger database located in the /tmp/badger directory.
// It will be created if it doesn't exist.
db, err := badger.Open(badger.DefaultOptions("./badger"))
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Your code hereโฆ
}
๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น๋ง ์ง์ ํด์ ์คํํ๋ฉด ๋๋ค.

๊ทธ๋ผ ์ด๋ฐ ํํ๋ก ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ค.
๋ฑ์ ์ ๊ธฐ๋ณธ๋์์ ๋์คํฌ์ง๋ง, ์ธ๋ฉ๋ชจ๋ฆฌ๋ก ๋์ํ๊ฒ ํ ์๋ ์๋ค.
์ด๋ ๊ฒ ์ต์
์ ์ฃผ๋ฉด ๋๋ค.
๊ฐ ์ฐ๊ธฐ
๋ฑ์ db๋ ๋ชจ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์
์ ํธ๋์ญ์
๋จ์๋ก ์คํํ๋ค.
๊ทธ๋์ ๋จ์ํ ๊ฐ์ ํ๋ ๊น๊ณ ์ถ๋ค ํด๋ ๋ค์๊ณผ ๊ฐ์ด ์ฐ๊ธฐ ํธ๋์ญ์
์ ์ด๊ณ ์จ์ผ ํ๋ค.
// ์ฐ๊ธฐ ํธ๋์ญ์
if err := db.Update(func(txn *badger.Txn) error {
// ์ฐ๊ธฐ ์์
์ํ
err := txn.Set([]byte("answer"), []byte("42"))
return err
}); err != nil {
log.Fatal(err)
}
๋ฐ์ดํธ ์์ผ๋ก ๊น๋ค.
๊ฐ ์ฝ๊ธฐ
๊ฐ์ ์ฝ์๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ๋์ญ์ ์ ์ด๊ณ ์ฝ์ด์ผ ํ๋ค.
// ์ฝ๊ธฐ ํธ๋์ญ์
if err := db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte("answer"))
if err != nil {
log.Fatal(err)
}
// ์์ดํ
์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
val, err := item.ValueCopy(nil)
if err != nil {
log.Fatal(err)
}
log.Printf("The answer is: %s\n", val)
return nil
}); err != nil {
log.Fatal(err)
}

๊ทธ๋ผ ์ ์ฝ์ด์ฌ ๊ฒ์ด๋ค.

TTL ์ค์
๋ง๋ฃ๊ธฐ๊ฐ์ ์ค์ ํด์ ๋ ๋์ค์ฒ๋ผ ์บ์ฑ์ฉ์ผ๋ก ์ธ ์๋ ์๋ค.
๋ฐ์ดํฐ ์ํธ๋ฆฌ์ ttl ์ต์
์ ๊ฑธ๊ณ ์ค์
๋ฃ์ผ๋ฉด ๋๋ค.
// ์ฐ๊ธฐ ํธ๋์ญ์
if err := db.Update(func(txn *badger.Txn) error {
// 1์๊ฐ ๋์ ์ ํจํ ํค-๊ฐ ์์ ๋ง๋ ๋ค.
entry := badger.NewEntry([]byte("answer"), []byte("4444")).WithTTL(time.Hour)
err := txn.SetEntry(entry)
return err
}); err != nil {
log.Fatal(err)
}

๊ธฐ๋ฅ์ ์ด์ ๋๋ก ์ต์ํ๋ง ๊ฐ๊ณ ์๋ ํธ์ด๋ค.
๋ง ์์ฒญ ๋ณต์กํ๊ฑฐ๋ ๋๋จํ ๊ธฐ๋ฅ์ด ์์ง ์๋ค.