Cum să folosești RocksDB cu Go

  • 2 minute de citit
  • 6 exemple de cod în Shell, Go și Make
  • 1 imagine

Disponibil și în English

Pe această pagină

blog thumbnail

Salut tuturor! 👋

Recent a trebuit să lucrez cu RocksDB și, ca să îl folosesc din Golang, a trebuit să trec prin câteva obstacole până când a funcționat cum trebuie.

Acest articol îți arată cum să compilezi un program Go și să îl legi cu RocksDB folosind CGO. Vom folosi biblioteca grocksdb.

Ce este RocksDB

RocksDB este un depozit cheie-valoare embedded dezvoltat de Meta.

Poate fi folosit ca motor de baze de date de către MySQL, MongoDB, Apache Cassandra și alții.

RocksDB poate fi adaptat și pentru alte cazuri de utilizare, cum ar fi procesarea de fluxuri, cache-ul pentru cozi de sarcini, stocarea grafurilor și altele.

Poți vedea toți utilizatorii și cazurile de utilizare pe pagina lor de wiki de pe GitHub.

Folosirea RocksDB într-un proiect Go pe Fedora Linux

Această secțiune îți arată cum să folosești RocksDB într-un proiect Go. Vom compila RocksDB pe Fedora 41.

Inițializarea proiectului Go

Primul pas este să creezi proiectul Go și să adaugi cerința grocksdb în fișierul go.mod. Al meu arată așa:

module grocks-tutorialgo 1.24require github.com/linxGnu/grocksdb v1.9.8 // indirect

Apoi, în fișierul main.go, poți adăuga următorul cod:

package mainimport (	"fmt"	"github.com/linxGnu/grocksdb"	"os")func main() {	bbto := grocksdb.NewDefaultBlockBasedTableOptions()	bbto.SetBlockCache(grocksdb.NewLRUCache(3 << 30))	opts := grocksdb.NewDefaultOptions() // 2	opts.SetBlockBasedTableFactory(bbto)	opts.SetCreateIfMissing(true)	db, err := grocksdb.OpenDb(opts, "my_rocks") // 1	if err != nil {		fmt.Printf("err %v", err)		os.Exit(1)	}	ro := grocksdb.NewDefaultReadOptions() // 2	wo := grocksdb.NewDefaultWriteOptions() // 2	// dacă ro și wo nu mai sunt folosite, nu uita să le închizi.	err = db.Put(wo, []byte("foo"), []byte("bar")) // 3	value, err := db.Get(ro, []byte("foo")) // 4	fmt.Printf("The value is `%s`.\n", value.Data()) // 4	defer value.Free()	err = db.Delete(wo, []byte("foo"))}

Codul face următoarele lucruri:

  1. Deschide o bază de date RocksDB în directorul my_rocks.
  2. Folosește opțiunile implicite pentru deschiderea bazei de date, citire și scriere de date.
  3. Scrie octeții bar la cheia foo.
  4. Citește cheia foo și afișează valoarea.

Putem folosi codul ca să testăm că lucrul cu RocksDB funcționează cu adevărat.

Compilarea RocksDB

Pentru a compila o versiune compatibilă de RocksDB, descarcă versiunea 9.8.4 din release-urile de pe GitHub:

Apoi fă cd în director, instalează compilatoarele dacă nu le ai și compilează RocksDB ca bibliotecă statică.

cd rocksdb-9.8.4sudo dnf install gcc gcc-c++EXTRA_CFLAGS=-mpclmul EXTRA_CXXFLAGS=-mpclmul PORTABLE=x86-64-v3 USE_RTTI=1 make static_lib

Compilarea va dura câteva minute.

Instalarea dependențelor necesare

Odată ce RocksDB este compilat, poți instala dependențele necesare folosind managerul de pachete:

dnf install snappy snappy-devel zlib zlib-devel bzip2 bzip2-devel lz4-devel libzstd-devel

Fișierele header și bibliotecile vor fi plasate în următoarele directoare:

  • /usr/include
  • /usr/lib64

Compilarea proiectului Go și legarea RocksDB

Ca să simplific lucrurile, am creat un Makefile care arată așa:

run:	CGO_CFLAGS="-I/home/dnutiu/GolandProjects/grocks-tutorial/rocksdb-9.8.4/include -I/usr/include" \	CGO_LDFLAGS="-L/home/dnutiu/GolandProjects/grocks-tutorial/rocksdb-9.8.4 -L/usr/lib64 -lrocksdb -lbz2 -lstdc++ -lm -lz -lsnappy -llz4 -lzstd" \    go run .

Makefile-ul conține calea către directorul meu de include și locația bibliotecilor RocksDB, precum și căile către dependențe.

La rulare, codul se va compila și va afișa:

➜  grocks-tutorial make runCGO_CFLAGS="-I/home/dnutiu/GolandProjects/grocks-tutorial/rocksdb-9.8.4/include -I/usr/include" \CGO_LDFLAGS="-L/home/dnutiu/GolandProjects/grocks-tutorial/rocksdb-9.8.4 -L/usr/lib64 -lrocksdb -lbz2 -lstdc++ -lm -lz -lsnappy -llz4 -lzstd" \    go run .The value is `bar`.

Gata!

Note despre MacOS

Pe MacOS poți instala toate pachetele cu brew.

Apoi execută brew info <nume-pachet>, care îți va arăta locația pachetului, iar aceasta va conține directoarele include și lib, pe care le poți adăuga în CGO_CFLAGS, respectiv CGO_LDFLAGS.


Sper că acest articol te-a ajutat să începi să lucrezi cu RocksDB în Go! 😄

Poți clona depozitul de cod de pe Forge-ul meu: https://gitlab.nuculabs.dev/dnutiu/grocks-tuturial.

Actualizare 04.04.2025 PS: Mulțumiri speciale colegului meu Cristi care m-a ajutat să aflu variabilele de mediu corecte pentru make.

Mulțumesc pentru lectură!