最近想研究Rocksdb,在此记录编译过程。

首先是Rocksdb编译,参考这里:https://github.com/facebook/rocksdb/blob/master/INSTALL.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ sudo apt-get install -y make g++ libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev git

$ git clone https://github.com/facebook/rocksdb.git
$ cd rocksdb
# golang的绑定库不支持最新的版本,切换到10
$ git checkout v10.10.1

# 不要用默认make/make all做生产构建,因为那会走debug模式,性能会差很多
# -j"$(nproc)"代笔使用所有核心进行编译
$ make shared_lib -j"$(nproc)"

$ sudo cp -r include/rocksdb /usr/local/include/
$ sudo cp librocksdb.so.10.10.1 /usr/local/lib/

$ cd /usr/local/lib
$ ls # 能看到librocksdb.so.10.10.1文件
$ sudo ln -s librocksdb.so.10.10.1 librocksdb.so.10.10
$ sudo ln -s librocksdb.so.10.10 librocksdb.so.10
$ sudo ln -s librocksdb.so.10 librocksdb.so

# 刷新动态库的缓存
$ sudo ldconfig

# 检查看看是否有输出
$ ldconfig -p | grep rocksdb
librocksdb.so.10.10 (libc6,x86-64) => /usr/local/lib/librocksdb.so.10.10
librocksdb.so (libc6,x86-64) => /usr/local/lib/librocksdb.so

cpp测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>

#include <rocksdb/db.h>
#include <rocksdb/options.h>

int main()
{
std::unique_ptr<rocksdb::DB> db = nullptr;

rocksdb::Options options;
options.create_if_missing = true;

std::string db_path = "./test_rocksdb";

rocksdb::Status status = rocksdb::DB::Open(options, db_path, &db);
if (!status.ok())
{
std::cerr << "Open failed: " << status.ToString() << std::endl;
return 1;
}

db->Put(rocksdb::WriteOptions(), "hello", "world");

std::string value;
status = db->Get(rocksdb::ReadOptions(), "hello", &value);

if (status.ok())
{
std::cout << value << std::endl;
}

return 0;
}

// g++ -std=c++20 main.cpp -o test -lrocksdb -lpthread -ldl
// 输出:
// world

golang测试

1
2
$ mkdir gorocktest && cd gorocktest
$ go mod init gorocktest

写入main.go,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package main

import (
"fmt"
"log"

"github.com/linxGnu/grocksdb"
)

func main() {
opts := grocksdb.NewDefaultOptions()
defer opts.Destroy()

opts.SetCreateIfMissing(true)

db, err := grocksdb.OpenDb(opts, "./test_rocksdb")
if err != nil {
log.Fatal(err)
}
defer db.Close()

wo := grocksdb.NewDefaultWriteOptions()
defer wo.Destroy()

ro := grocksdb.NewDefaultReadOptions()
defer ro.Destroy()

err = db.Put(wo, []byte("name"), []byte("Kemal"))
if err != nil {
log.Fatal(err)
}

value, err := db.Get(ro, []byte("name"))
if err != nil {
log.Fatal(err)
}
defer value.Free()

fmt.Println("name =", string(value.Data()))

err = db.Delete(wo, []byte("name"))
if err != nil {
log.Fatal(err)
}
}
// go run .
// 输出:
// name = Kemal