目前项目已快截止,编码任务也基本完成,现在主要是性能测试。
项目是按照“Tair LDB基于Prefixkey的范围查找性能优化项目提议方案”的步骤一步步完成的,首先先介绍第一个关键问题是如何解决的。在提案中有以下描述:
由于getrange接口的数据是从prefixput/prefixincr接口进来的,那么prefix的长度信息就可以从它们的pkey参数得到,pkey的数据类型是dataentry,有属性prefixsize,那么我们在客户端将pkey和skey合并为mkey(已经设置mkey的prefixsize为pkey的size)后与value一起传送到服务器端。
在客户端与服务器端的连接过程中,将key的类型封装成LdbKey类,value的类型封装成LdbItem类,LdbItem里面含有key的prefixsize信息,然后两者都转化为Slice类型发送到leveldb底层进行存储操作。注意此时value里面包含了prefixszie信息(序列化信息,不能直接提取),因此我们在生成filter block时可以从value中提取出prefix_size信息(按LdbItem的格式进行分析提取)以生成我们所需要的prefix bloomfilter。提取的具体实现可以放在leveldb层的外面,在leveldb里面进行调用即可(分离操作)。
这里面提到一个关键信息:key的prefix_size信息在db中是存储在value中而不是在key中.
那么value的格式是什么样的呢?
首先value的内容是由LdbItem的数据得到的,知道了LdbItem里数据的存储格式也就知道了value的数据存储格式。LdbItem里data_的数据构成是由下面这个set函数完成的:
// meta_ MUST already be set correctly
void set(const char* value_data, const int32_t value_size)
{
if (value_data != NULL && value_size > 0)
{
char *metap = reinterpret_cast<char