眼下项目已快截止,编码任务也基本完毕。如今主要是性能測试。

项目是依照“Tair LDB基于Prefixkey的范围查找性能优化项目提议方案”的步骤一步步完毕的,首先先介绍第一个关键问题是怎样解决的。

在提案中有以下描写叙述:

因为getrange接口的数据是从prefixput/prefixincr接口进来的。那么prefix的长度信息就能够从它们的pkey參数得到。pkey的数据类型是dataentry,有属性prefixsize,那么我们在client将pkey和skey合并为mkey(已经设置mkey的prefixsize为pkey的size)后与value一起传送到server端。

在client与server端的连接过程中,将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 *>(&meta_);
int real_meta_size = LDB_ITEM_META_BASE_SIZE;
LdbItemMetaBase *metabp = reinterpret_cast<LdbItemMetaBase *>(&meta_);
free();
if (metabp->flag_ & TAIR_ITEM_FLAG_NEWMETA)
{
if (META_VER_PREFIX == metabp->meta_version_)
real_meta_size = LDB_ITEM_META_SIZE;
else if (META_VER_BASE == metabp->meta_version_)
real_meta_size = LDB_ITEM_META_BASE_SIZE;
}
data_size_ = value_size + real_meta_size;
data_ = new char[data_size_];
memcpy(data_, metap, real_meta_size);
memcpy(data_ + real_meta_size, value_data, value_size);
alloc_ = true;
}
}

能够知道data_的内容由两部分构成:

| LdbItemMeta数据 | 真实的value内容 |

或者

| LdbItemMetaBase数据 | 真实的value内容 |

两者的差别在于LdbItemMeta数据包括prefix_size信息而LdbItemMetaBase数据不包括。这通过这两个简单的数据结构组成部分就知道了。

  struct LdbItemMetaBase
{
LdbItemMetaBase() : meta_version_(0), flag_(0), version_(0), cdate_(0), mdate_(0), edate_(0){}
uint8_t meta_version_; // meta data version
uint8_t flag_; // flag
uint16_t version_; // version
uint32_t cdate_; // create time
uint32_t mdate_; // modify time
uint32_t edate_; // expired time(for meta when get value. dummy with key)
}; struct LdbItemMeta // change value() and set() ,if you want to add new metadata
{
LdbItemMeta(): prefix_size_(0) {}
struct LdbItemMetaBase base_;
uint16_t prefix_size_; // prefix key size(for getRange conflict detect)
uint16_t reserved; //
};

因此假设value的第一部分是LdbItemMeta数据,就说明它包括prefixsize信息,我们就能够将value内容按LdbItemMeta的格式进行解析。从而提取出当中的prefixsize信息。

以下是详细的解析提取程序:

// get prefix size from slice value content
int get_prefix_size(const leveldb::Slice &value) {
// parse LdbItemMetaBase from value
char *val = const_cast<char*>(value.data());
LdbItemMeta *metap = reinterpret_cast<LdbItemMeta*>(val);
// check if prefix is set
if (metap->base_.flag_ & TAIR_ITEM_FLAG_NEWMETA) {
// if prefix is set, parse it from LdbItemMeta. if not, return 0
if (META_VER_PREFIX == metap->base_.meta_version_) {
return metap->prefix_size_;
} else {
return 0;
}
} return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Tair LDB基于Prefixkey找到如何提取一系列性能优化项目key的prefix_size的更多相关文章

  1. Tair LDB基于Prefixkey中期范围内查找性能优化项目总结

    "Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...

  2. 基于SSD固态硬盘的数据库性能优化

    基于SSD固态硬盘的数据库性能优化 2010-11-08 00:0051cto佚名   关键字:固态硬盘 数据库管理 SSD 企业软件热点文章 Java内存结构与模型结构分析 Oracle触发器的语法 ...

  3. 基于mongoDB的capped collection的性能优化

    MonitorLogging改造(消息接入) 改造前架构: 可以看出原来的流程中,大量业务分析,业务接入耦合在web服务层.大量操作,导致线程线性的挂起线程. 改造后: 将业务通讯抽象成为Monito ...

  4. nRF24L01基于FIFO TX队列的发送性能优化

    RF24项目代码分析 头文件 https://github.com/nRF24/RF24/blob/master/RF24.h 源文件 https://github.com/nRF24/RF24/bl ...

  5. 基于AngularJS/Ionic框架开发的性能优化

    AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...

  6. 基于spark和flink的电商数据分析项目

    目录 业务需求 业务数据源 用户访问Session分析 Session聚合统计 Session分层抽样 Top10热门品类 Top10活跃Session 页面单跳转化率分析 各区域热门商品统计分析 广 ...

  7. 基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目

    基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目 写在前面: 不知道大家有没有经历过,在茫茫车海中找不到自己山地车情况,针对这个痛点(开玩笑的),我做了个小玩意,纯属娱乐,拿出来,在疫 ...

  8. 关键词提取自动摘要相关开源项目,自动化seo

    关键词提取自动摘要相关开源项目 GitHub - hankcs/HanLP: 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换https:/ ...

  9. 基于jmeter和shell的接口性能自动化

    基于jmeter和shell的接口性能自动化 1. 总体需求 由于性能测试中涉及的查询接口多,版本迭代频繁,版本更新后自动跑一轮查询业务的性能,可以及时发现一些开发修复bug触发的非预期的bug,利用 ...

随机推荐

  1. VC POST表单——登录验证新浪邮箱

    1.本机环境: Windows XP SP3.ADSL 2.开发工具: WildPackets OmniPeek V5.1.4 Visual C++ 6.0 IE6.0 FlexEdit V2.3.1 ...

  2. 有一个NSStirng类型,retain时尚宣言name财产setter内部方法的每一行代码的作用?

    - (void)setName:(NSString *)name {        推断原有对象和新对象是否是同一个对象,假设是同一个,就没有必要再又一次赋值,否则会先release 再retain, ...

  3. HDU ACM 1065 I Think I Need a Houseboat

    分析:告诉协调的房子,每年(0,0)作为一个半圆区域的中心将被添加50.请教如何多年以来,这家的位置将是半圆内.注意pi必须采取3.1415926管辖权. #include<iostream&g ...

  4. What is Observer and Observable and when we used these?

    转会:http://stackoverflow.com/questions/13744450/interview-when-do-we-use-observer-and-observable

  5. Linux网络基础设施配置

    1.TCP/IP网络配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network /etc/host.conf /etc/ ...

  6. React.js入门笔记 创建hello world 的6种方式

    一.ReactJS简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站. ...

  7. cocos2d-x3.x屏蔽遮罩层屏蔽触摸button

    cocos2d-x3.x触摸方法改变后,.屏蔽掉的层实际上触摸事件的非常easy,首先touchbegan一定要回true,第二,该事件被设定为听吞没触摸true.最近登录触摸水平必须低于0,现在,我 ...

  8. ssl通关的概念(一个)

    在公司最近的项目涉及多种加密.安全.我一直在这方面缺乏经验.很协议仅仅知道是什么概念.用于传输的加密SSL,也煞费苦心.非常easy一件事,折腾了很长一段时间.IT该行啊,真的是.难者不会,与会者困难 ...

  9. 百度地图 iOS SDK - 坐标转换方法

    百度地图 Android SDK 要么 iOS SDK 或各种 API 工具产品,我们使用百度自己的加密坐标系. 员在使用过程中,位置点都是通过 GPS 或者其它途径获取的.所以与百度地图所使用的坐标 ...

  10. velocity基本语法

    一.基本语法 1."#"用于识别Velocity该脚本语句,这包括#set.#if .#else.#end.#foreach.#end.#iinclude.#parse.#macr ...