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.