golang rocksdb安装和使用

1、开发环境
ubuntu18
2、下载 rocksdb

wget https://github.com/facebook/rocksdb/archive/refs/tags/v7.2.2.tar.gz

tar xvzf v7.2.2.tar.gz
cd rocksdb-7.2.2/
make shared_lib -j9
sudo make install

3、安装其他依赖
文档写要安装
Linux - Ubuntu

sudo apt-get install libgflags-dev

sudo apt install -y libsnappy-dev liblz4-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev

发现只有zlib ,bzip2 安装成功了,其他3个根本找不到安装包,也就算了

4、安装 gorocksdb


go get github.com/linxGnu/grocksdb

CGO_CFLAGS="-I/usr/local/include/rocksdb/" \
CGO_LDFLAGS="-L/usr/local/lib -lrocksdb -lstdc++ -lm -lz -lbz2 -lsnappy -llz4 -lzstd" \
go build

5.测试

package main

import (
	"errors"
	"log"
	"strconv"

	"github.com/linxGnu/grocksdb"

	"github.com/sirupsen/logrus"
)

const (
	DB_PATH      = "/data2/wuyongyu/test/grocksdb"
	TABLE_PREFIX = "TABLE_PREFIX"
)

// opendb
func OpenDB() (*grocksdb.DB, error) {
	options := grocksdb.NewDefaultOptions()
	options.SetCreateIfMissing(true)

	bloomFilter := grocksdb.NewBloomFilter(10)

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

	rateLimiter := grocksdb.NewRateLimiter(10000000, 10000, 10)
	options.SetRateLimiter(rateLimiter)
	options.SetCreateIfMissing(true)
	options.EnableStatistics()
	options.SetWriteBufferSize(8 * 1024)
	options.SetMaxWriteBufferNumber(3)
	options.SetMaxBackgroundCompactions(10)
	// options.SetCompression(grocksdb.SnappyCompression)
	// options.SetCompactionStyle(grocksdb.UniversalCompactionStyle)

	options.SetHashSkipListRep(2000000, 4, 4)

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

	options.SetBlockBasedTableFactory(blockBasedTableOptions)
	//log.Println(bloomFilter, readOptions)
	options.SetPrefixExtractor(grocksdb.NewFixedPrefixTransform(3))

	options.SetAllowConcurrentMemtableWrites(false)

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

	if err != nil {
		log.Fatalln("OPEN DB error", db, err)
		db.Close()
		return nil, errors.New("fail to open db")
	} else {
		log.Println("OPEN DB success", db)
	}
	return db, nil
}

func TestRead(key string, db *grocksdb.DB) {
	readOptions := grocksdb.NewDefaultReadOptions()
	readOptions.SetFillCache(true)
	slice, err2 := db.Get(readOptions, []byte(key))
	defer slice.Free()
	if err2 != nil {
		log.Println("test_read get data exception:", key, err2)
	}
	logrus.Info("TestRead data:", slice.Exists())
	log.Println("test_read get data:", slice.Size(), string(slice.Data()))
}

func TestSetTableId(key string, db *grocksdb.DB) {
	writeOptions := grocksdb.NewDefaultWriteOptions()
	writeOptions.SetSync(true)
	keyStr := TABLE_PREFIX + ":" + key
	var keybyte []byte = []byte(keyStr)
	db.Put(writeOptions, keybyte, keybyte)
}

func TestUpdateTableId(key string, val string, db *grocksdb.DB) {
	writeOptions := grocksdb.NewDefaultWriteOptions()
	writeOptions.SetSync(true)
	keyStr := TABLE_PREFIX + ":" + key
	var keybyte []byte = []byte(keyStr)
	db.Put(writeOptions, keybyte, []byte(val))
}

func TestGetTableId(key string, db *grocksdb.DB) {
	readOptions := grocksdb.NewDefaultReadOptions()
	readOptions.SetFillCache(true)
	keyStr := TABLE_PREFIX + ":" + key
	var keybyte []byte = []byte(keyStr)
	slice, err2 := db.Get(readOptions, keybyte)
	defer slice.Free()
	if err2 != nil {
		log.Println("test_read get data exception:", key, err2)
	}
	logrus.Info("TestRead data:", slice.Exists())
	log.Println("test_read get data:", slice.Size(), string(slice.Data()))
}

func main() {
	logrus.Info("rocksdb test begin")
	db, err := OpenDB()
	if err != nil {
		log.Println("fail to open db,", nil, db)
	}

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

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

	// for i := 0; i < 10; i++ {
	// 	keyStr := "test" + strconv.Itoa(i)
	// 	var key []byte = []byte(keyStr)
	// 	db.Put(writeOptions, key, key)
	// 	log.Println(i, keyStr)
	// 	slice, err2 := db.Get(readOptions, key)
	// 	if err2 != nil {
	// 		log.Println("get data exception:", key, err2)
	// 		continue
	// 	}
	// 	log.Println("get data:", slice.Size(), string(slice.Data()))
	// }

	for i := 0; i < 10; i++ {
		keyStr := "test" + strconv.Itoa(i)
		var key []byte = []byte(keyStr)
		log.Println(i, keyStr)
		slice, err2 := db.Get(readOptions, key)
		defer slice.Free()
		if err2 != nil {
			log.Println("get data exception:", key, err2)
			continue
		}
		log.Println("get data:", slice.Size(), string(slice.Data()))
	}
	TestRead("dasd", db)
	TestSetTableId("dasd", db)
	TestUpdateTableId("dasd", "1223", db)
	TestGetTableId("dasd", db)
	readOpts := grocksdb.NewDefaultReadOptions()
	readOpts.SetFillCache(true)
	it := db.NewIterator(readOpts)
	defer it.Close()
	for it.SeekToFirst(); it.Valid(); it.Next() {
		logrus.Info("table_db item name:", string((it.Key().Data())))
	}

	ds, err2 := db.GetBytes(readOpts, []byte("1222"))
	if err2 != nil {
		logrus.Error("error:", err2, " ds:", ds)
	} else {
		logrus.Info("ds:", len(ds))
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝鲸123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值