当前位置: 首页 > 工具软件 > RocksDB > 使用案例 >

RocksDB

许沛
2023-12-01

RocksDB是使用C ++编写的嵌入式kv存储引擎,其键值均允许使用二进制流。由Facebook基于levelDB开发,提供向后兼容的levelDB API。

RocksDB针对Flash存储进行优化,延迟极小.RocksDB使用LSM存储引擎,纯C ++编写.Java版本RocksJava正在开发中。参见RocksJavaBasic。

RocksDB依靠大量灵活的配置,使之能针对不同的生产环境进行调优,包括直接使用内存,使用闪存,使用硬盘或者HDFS。支持使用不同的压缩算法,并且有一套完整的工具供生产和调试使用。

首先RocksDB如果是java依赖,需要添加maven

        <dependency>
			<groupId>org.rocksdb</groupId>
			<artifactId>rocksdbjni</artifactId>
			<version>5.5.1</version>
		</dependency>

对于现在而言,RocksDB不适合java项目,但是更适合go项目,那么现在就用go语言进行举例
设置缓存方法与存储类型

package cache

type Cache interface {
	Set(string, []byte) error
	Get(string) ([]byte, error)
	Del(string) error
	GetStat() Stat
}

package cache

import "C"

type rocksdbCache struct {
	db *C.rocksdb_t
	ro *C.rocksdb_readoptions_t
	wo *C.rocksdb_writeoptions_t
	e  *C.char
}


package cache

import "log"

func New(typ string) Cache {
	var c Cache
	if typ == "rocksdb" {
		c = newRocksdbCache()
	}
	if c == nil {
		panic("unknown cache type " + typ)
	}
	log.Println(typ, "ready to serve")
	return c
}

RocksDB 通过key获取

package cache

import "C"
import (
	"errors"
	"unsafe"
)

func (c *rocksdbCache) Get(key string) ([]byte, error) {
	k := C.CString(key)
	defer C.free(unsafe.Pointer(k))
	var length C.size_t
	v := C.rocksdb_get(c.db, c.ro, k, C.size_t(len(key)), &length, &c.e)
	if c.e != nil {
		return nil, errors.New(C.GoString(c.e))
	}
	defer C.free(unsafe.Pointer(v))
	return C.GoBytes(unsafe.Pointer(v), C.int(length)), nil
}

RocksDB插入

package cache

import "C"
import (
	"errors"
	"unsafe"
)

func (c *rocksdbCache) Set(key string, value []byte) error {
	k := C.CString(key)
	defer C.free(unsafe.Pointer(k))
	v := C.CBytes(value)
	defer C.free(v)
	C.rocksdb_put(c.db, c.wo, k, C.size_t(len(key)), (*C.char)(v), C.size_t(len(value)), &c.e)
	if c.e != nil {
		return errors.New(C.GoString(c.e))
	}
	return nil
}

RocksDB删除

package cache

import "C"
import (
	"errors"
	"unsafe"
)

func (c *rocksdbCache) Del(key string) error {
	k := C.CString(key)
	defer C.free(unsafe.Pointer(k))
	C.rocksdb_delete(c.db, c.wo, k, C.size_t(len(key)), &c.e)
	if c.e != nil {
		return errors.New(C.GoString(c.e))
	}
	return nil
}

参考:https://rocksdb.org.cn/doc.html

 类似资料: