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,利用 ...
随机推荐
- Spark 1.0.0版本发布
前言 如今Spark终于迈出了里程碑一步,1.0.0标记的版本号出版物Spark1.0时代.1.0.0版本号不仅增加了非常多新特性.而且提供了更好的API支持.Spark SQL作为一个新的组件增加. ...
- JAVA设计模式(08):结构化-飞锤(Flyweight)
当前咱们国家正在大力倡导构建和谐社会,当中一个非常重要的组成部分就是建设资源节约型社会,"浪费可耻,节俭光荣". 在软件系统中,有时候也会存在资源浪费的情况,比如在计算机内存中存储 ...
- ios说说自己的计划是什么样的发展论坛
ios发展论坛在显示 iOS 5 在,主界面包含以下内置的应用程序: 信息.日历.照片. YouTube.股市.地图(AGPS辅助的Google地图).天气.时间.计算机.备忘录.系统设置. ...
- HSV 量化
function L=hsvquan(hsv) %对HSV量化,该3维特征矢量: h=hsv(:,:,1); s=hsv(:,:,2); v=hsv(:,:,3); % 假设对HSV 空间进行适当的量 ...
- SqlServer 添加列并赋值
有个需求,需要给某张表添加一列并且赋值,分解需求,一共分两部走: 添加列 赋值 两个功能都不难,很快实现. --add column alter table Med_Summary_Template ...
- Android供TextView添加多个点击文字
我们使用社会性软件的过程中会或多或少像别人的帖子点,图. : 能够看到用户页面显示出来的仅仅是点了赞的用户的名称,点击这些名称能够进入到该用户的主页.我们就来实现相似的效果.直接上代码吧. @Over ...
- hdoj 2121 Ice_cream’s world II 【没有最低树的根节点】
称号:pid=2121" target="_blank">hdoj 2121 Ice_cream's world II 题意:题目是一道躶题,给n个点,m条边的有向 ...
- onethink和phpwind共享
将onethink和phpwind数据库安装在一起.使用公用表前缀. 将onethink的member表点phpwind有user表 这是onethink在根文件夹的安装,phpwind安装在bbs的 ...
- B/S在北大青鸟-ASP.NET 总结
一个.前言: 这几周跟着于海涛老师进入了.NET编程世界.领略到了ASP.NET的精髓. 要说起ASP.NET的发展史,那要追溯到HTML了,由于它功能简单,无法从用户接收信息并自己主动进行更新.而不 ...
- java实现生产者消费者问题(转)
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...