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,利用 ...
随机推荐
- RH033读书笔记(8)-Lab 9 Using vim
Lab 9 Using vim Sequence 1: Navigating with vim 1. Log in as user student 2. [student@stationX ~]$ c ...
- hdu 4454 Stealing a Cake(三分之二)
pid=4454" target="_blank" style="">题目链接:hdu 4454 Stealing a Cake 题目大意:给定 ...
- freemarker错误九
1.错误叙述性说明 五月 30, 2014 11:52:04 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template p ...
- 【YouVersion】 The Bible 圣经App
[YouVersion] The Bible 圣经 App 今天向大家郑重推荐一款非常棒的圣经App : <The Bible> YouVersion 团队开发的全球下载量和安装数目第 ...
- sql 添加用户
use master GO EXEC sp_addlogin 'infos1', '1', 'master' exec sp_grantdbaccess 'infos311' -- 给访问权限 USE ...
- Scilab 的画图函数(1)
Scilab 的画图函数 plot 函数 最主要的是 plot 函数,与 matlab 中的plot 函数类似. xdata = linspace(1,10,50); ydata = sin(xdat ...
- 使用WindowManager添加您自己的自定义视图
在写手机卫士的时候,用户拨打|接听电话须要显示号码归属地,然后出现了一些异常,在此留下记号.希望对麻友们有帮助: BUG教程 在使用 view = View.inflate(this, R.layou ...
- Swing JDialog监听回车键
在做项目时,发现在JDialog中,直接通过addKeyListener来监听回车键不起作用,无法监听到回车键,后面在网上查了些资料,终于解决了.方法如下: KeyStroke stroke = Ke ...
- mysql_install_db出错,Unable to lock /usr/local/mysql/var/ibdata1, error: 11
今天,在一台旧机器上编译一个新的Mysql,install时出了错: /usr/local/mysql_5615/scripts/mysql_install_db --user=mysql --bas ...
- spark未来的发展方向
spark是採用scala语言开发的基于内存的计算框架,作者Matei Zaharia,在未来的发展方向: 1.spark streaming:提高spark的流处理能力,使得spark更适于通过一套 ...