RocksDB存储其他类型数据

RocksDB存数据的时候只能用Slice类型存储,将std::string转成Slice再Put写进去。

但是经常遇到需要存储的类型不是字符串,可能需要存储bool类型或int,float类型的数据。其实从Slice类型的本质去理解就可以想办法存储其他类型的数据了。

Slice本质是一个指针指向存储的数据内存地址,同时记录下数据的长度。因此不管数据是什么类型,只要内存数据原封不动的存起来,取的时候就能还原为特定类型的数据。

具体操作代码如下,因为操作语句比较长,所以用宏来进行替换。

// 将数据封装成Slice对象
#define TO_SLICE(type, value) \
    Slice(reinterpret_cast<const char*>(&value), sizeof(type))

// 从取出的数据中还原为原来的类型
#define FROM_STRING(type ,value) \
    *reinterpret_cast<const type*>(value.data())

// 取值操作,和本文关系不大
#define GET_VALUE(handle, key, output) \
    m_pDB->Get(m_optRead, handle Slice(key), output);

// 写入数据
int i = 114514;
float f = 114.514
bool b = true;

WriteBatch batch;
batch.Put(pHandle, Slice("int_value"), TO_SLICE(int, i));
batch.Put(pHandle, Slice("float_value"), TO_SLICE(float, f));
batch.Put(pHandle, Slice("bool_value"), TO_SLICE(bool, b));
status s = m_pDB->Write(m_optWrite, &batch);

// 取数据
string value; // 作为取值buffer
GET_VALUE(pHandle, "int_value", &value); // 将数据放到value中
int i = FROM_STRING(int, value); // 转换为int 类型赋值给i
GET_VALUE(pHandle, "float_value", &value);
float f = FROM_STRING(float, value);
GET_VALUE(pHandle, "bool_value", &value);
bool b = FROM_STRING(bool, value);

至于其他类型作为key来用,理论上也是一样的,不过正常应该不会有这种需求吧。

@

Show Comments