Introdução ao gorocksdb: interface Go para o RocksDB

O RocksDB é uma tecnloogia de armazenamento de chave-valor altamente eficiente, desenvolvida pelo Facebook e amplamente utilizada em sistemas que exigem alta performance. Embora seja implementado em C++, existem bindings para diversas linguagens de programação, incluindo Java e, naturalmente, Go.

A biblioteca gorocksdb representa uma solução robusta para desenvolvedores Go que necessitam utilizar o RocksDB em suas aplicações. Esta wrapper oferece uma接口 nativa para a linguagem, permitindo explorar todos os recursos do banco de dados diretamente do código Go.

A seguir, apresentamos um exemplo prático de utilização da biblioteca:

import ( "github.com/leeyazhou/gorocksdb" "log" "errors" "strconv" )

const ( DB_PATH = "/tmp/gorocksdb" )

func main() { db, err := initializedbConnection() if err != nil { log.Println("falha ao abrir banco de dados:", nil, db) return }

readOptions := gorocksdb.NewDefaultReadOptions()
readOptions.SetFillCache(true)

writeOptions := gorocksdb.NewDefaultWriteOptions()
writeOptions.SetSync(true)

for i := 0; i < 10000; i++ {
    keyStr := "chave_" + strconv.Itoa(i)
    var key []byte = []byte(keyStr)
    
    if putErr := db.Put(writeOptions, key, key); putErr != nil {
        log.Printf("erro ao inserir: %v\n", putErr)
        continue
    }
    
    log.Printf("índice: %d, chave: %s\n", i, keyStr)
    
    value, getErr := db.Get(readOptions, key)
    if getErr != nil {
        log.Printf("erro ao recuperar dados para a chave %s: %v\n", key, getErr)
        continue
    }
    log.Printf("dados obtidos - tamanho: %d, conteúdo: %s\n", value.Size(), string(value.Data()))
}

db.Close()
readOptions.Destroy()
writeOptions.Destroy()

}

func initializedbConnection() (*gorocksdb.DB, error) { options := gorocksdb.NewDefaultOptions() options.SetCreateIfMissing(true)

bloomFilter := gorocksdb.NewBloomFilter(10)

readOptions := gorocksdb.NewDefaultReadOptions()
readOptions.SetFillCache(false)

rateLimiterConfig := gorocksdb.NewRateLimiter(10000000, 10000, 10)

options.SetRateLimiter(rateLimiterConfig)
options.SetCreateIfMissing(true)
options.EnableStatistics()
options.SetWriteBufferSize(8 * gorocksdb.KB)
options.SetMaxWriteBufferNumber(3)
options.SetMaxBackgroundCompactions(10)
options.SetCompression(gorocksdb.SnappyCompression)
options.SetCompactionStyle(gorocksdb.UniversalCompactionStyle)
options.SetHashSkipListRep(2000000, 4, 4)

blockBasedTableOptions := gorocksdb.NewDefaultBlockBasedTableOptions()
blockBasedTableOptions.SetBlockCache(gorocksdb.NewLRUCache(64 * gorocksdb.KB))
blockBasedTableOptions.SetFilterPolicy(bloomFilter)
blockBasedTableOptions.SetBlockSizeDeviation(5)
blockBasedTableOptions.SetBlockRestartInterval(10)
blockBasedTableOptions.SetCacheIndexAndFilterBlocks(true)
blockBasedTableOptions.SetIndexType(gorocksdb.KHashSearchIndexType)

options.SetBlockBasedTableFactory(blockBasedTableOptions)
options.SetPrefixExtractor(gorocksdb.NewFixedPrefixTransform(3))
options.SetAllowConcurrentMemtableWrites(false)

db, err := gorocksdb.OpenDb(options, DB_PATH)

if err != nil {
    log.Printf("erro ao abrir banco de dados: %v, erro: %v\n", db, err)
    return nil, errors.New("falha ao abrir banco de dados")
}

log.Printf("banco de dados aberto com sucesso: %v\n", db)
return db, nil

}


</div>Configurações Importantes
-------------------------

No exemplo acima, destacamos diversas configurações essenciais para otimização do desempenho:

- **CreateIfMissing:** Cria o banco autoamticamente caso não exista
- **Bloom Filter:** Otimiza consultas reduzindo leituras desnecessárias no disco
- **Rate Limiter:** Controla a taxa de operações de E/S
- **Compression:** Utiliza compactação Snappy para redução de espaço
- **Block Cache:** Configura cache LRU para加速ar leituras frequentes

Estas configurações permitem ajustar o comportamento do RocksDB conforme as necessidades específicas de cada aplicação, seja priorizando performance, economia de memória ou durabilidade das operações.

Tags: rocksdb Golang key-value-store database performance

Publicado em 8-2 15:52