Tair LDB基于Prefixkey找到如何提取一系列性能优化项目key的prefix_size
眼下项目已快截止,编码任务也基本完毕。如今主要是性能測试。
项目是依照“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的更多相关文章
- Tair LDB基于Prefixkey中期范围内查找性能优化项目总结
"Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...
- 基于SSD固态硬盘的数据库性能优化
基于SSD固态硬盘的数据库性能优化 2010-11-08 00:0051cto佚名 关键字:固态硬盘 数据库管理 SSD 企业软件热点文章 Java内存结构与模型结构分析 Oracle触发器的语法 ...
- 基于mongoDB的capped collection的性能优化
MonitorLogging改造(消息接入) 改造前架构: 可以看出原来的流程中,大量业务分析,业务接入耦合在web服务层.大量操作,导致线程线性的挂起线程. 改造后: 将业务通讯抽象成为Monito ...
- nRF24L01基于FIFO TX队列的发送性能优化
RF24项目代码分析 头文件 https://github.com/nRF24/RF24/blob/master/RF24.h 源文件 https://github.com/nRF24/RF24/bl ...
- 基于AngularJS/Ionic框架开发的性能优化
AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...
- 基于spark和flink的电商数据分析项目
目录 业务需求 业务数据源 用户访问Session分析 Session聚合统计 Session分层抽样 Top10热门品类 Top10活跃Session 页面单跳转化率分析 各区域热门商品统计分析 广 ...
- 基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目
基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目 写在前面: 不知道大家有没有经历过,在茫茫车海中找不到自己山地车情况,针对这个痛点(开玩笑的),我做了个小玩意,纯属娱乐,拿出来,在疫 ...
- 关键词提取自动摘要相关开源项目,自动化seo
关键词提取自动摘要相关开源项目 GitHub - hankcs/HanLP: 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换https:/ ...
- 基于jmeter和shell的接口性能自动化
基于jmeter和shell的接口性能自动化 1. 总体需求 由于性能测试中涉及的查询接口多,版本迭代频繁,版本更新后自动跑一轮查询业务的性能,可以及时发现一些开发修复bug触发的非预期的bug,利用 ...
随机推荐
- 移动开发中Fiddler的那些事儿 (转)
当我以前在调PC端网页的时候,Firefox有Firebug,Chrom也有自己的调试抓包工具,用起来很方便. 但是现在我要在手机上面调试页面,这个时候就没有这么方便的现成工具了. 后面发现了Fidd ...
- 2014百度之星预赛(第二场)——Best Financing
2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...
- 文章之间的基本总结:Activity生命周期
孔子:温故而知新.它可以作为一个教师.<论语> 同样的学习技巧.对于技术文件或书籍的经典技术,期待再次看到它完全掌握,这基本上是不可能的,所以,我们常常回来几次,然后仔细研究,为了理解作者 ...
- 【转】Android HTTP协议
前言 说到HTTP协议,那必须要说说WWW了,WWW是环球信息网(World Wide Web )的缩写,也可以简称为Web,中文名字为“万维网”.简单来说,WWW是以Internet作为传输媒介的一 ...
- HDU 4896 Minimal Spanning Tree(矩阵高速功率)
意甲冠军: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一 ...
- Cordova WP8 平台安装部署
原文:Cordova WP8 平台安装部署 Cordova是一个开放源码移动开发框架. 它允许您使用标准的 web 技术如 HTML5. CSS3 和 JavaScript 进行跨平台开发,避免每个移 ...
- Java多播通讯框架 JGroups(转)
JGroups是一个可靠的群组通讯Java工具包.它基于IP组播(IP multicast),但在可靠性,组成员管理上对它作了扩展. JGroups的可靠性体现在: 1,对所有接收者的消息的无丢失传输 ...
- apache kafka系列之-监控指标
apache kafka中国社区QQ群:162272557 1.监控目标 1.当系统可能或处于亚健康状态时及时提醒,预防故障发生 2.报警提示 a.短信方式 b.邮件 2.监控内容 2.1 机器监控 ...
- android4.4组件分析--service组件-bindService源代码分析
6.1.1. bindService 由于有前面分析startService的代码实现过程,则对于bindService的代码分析就不用那么具体介绍,在介绍流程的同一时候更关注一些细节上的部分. ...
- bcp sqlcmd bulkinsert在unicode问题,Unexpected EOF encountered in BCP data-file
senario 进入sqlcmd使用:out xxx产生的数据文件,因为sqlcmd export to file 默认情况下,中国的乱码.因此,使用-u(unicode)开关 @echo off & ...