免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wlmqgzm
打印 上一主题 下一主题

[C++] 读性能超过Memcached 65%, 单核也超过redis, 支持日志支持掉电保护,欢迎试用 [复制链接]

论坛徽章:
0
81 [报告]
发表于 2016-06-12 21:22 |只看该作者
很庞大的一个项目啊  其实比较建议分成两个工程独立开发:一为存储引擎, 二为存储服务

另外有一个地方是int可以用zigzag算法序列化为变长存储, 占用空间最少1字节,最多5字节,和int值大小有关,这个在protobuffer里有用到, 大部分int值比较小的时候,节省的空间非常大。这里有一个实现: github.com/yinqiwen/ardb/blob/0.9/src/common/buffer/buffer_helper.cpp#L579


论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
82 [报告]
发表于 2016-06-14 00:00 |只看该作者
回复 81# kingwon

这个项目是比较大, 越做越大, ,  然后最近慢了下来.  
整数的压缩代码也已经做了, 数据结构方面还在改进和优化, 主要是考虑适应各种情况, 包括结构化的, 非结构化的, 混合的等等, 最后可能类似Mysql, 每个表可采用不同的格式类型


   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
83 [报告]
发表于 2016-06-22 19:01 |只看该作者
最近家里有人生病住院, 暂时停止一段时间, 忙家里事情去了

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
84 [报告]
发表于 2016-06-30 16:29 |只看该作者
现在医院真贵啊,15岁孩子感冒高热一周, 然后就进ICU了, 每天3000-6000元, 输液输的两手都肿了。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
85 [报告]
发表于 2016-07-01 11:47 |只看该作者
祝福孩子快快好起来吧,娃娃是心头肉啊!~

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
86 [报告]
发表于 2016-07-17 10:37 |只看该作者
孩子终于出院了, 算捡回了一条命, 感冒病毒感染, 继发细菌感染, 然后各类抗生素无效, 出现败血症, 最后终于找到了特效药美国进口抗生素斯沃, 用上三天后退烧, 但是还有后遗症, 肺不张肺实变, 1/4肺功能受损, 等后续二到三个月的恢复

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
87 [报告]
发表于 2016-07-17 14:43 |只看该作者
本帖最后由 wlmqgzm 于 2016-07-17 14:45 编辑

继续开发代码, 现在准备解决的主要的问题是:

1)计划重新写 Key Map  这部分代码, 准备先简化, 主字段 整体所有的字节都放到内存中, 包括主字段Key, hash id, Global Offset, 占用空间为主字段Key的长度+16字节,  减少程序间的耦合, 后期再考虑优化空间.

初期这部分代码主要的思路是: 初期的设计考虑用尽可能少的内存来实现最大化的记录数的地址索引, 因此, 架构中 主字段( key) 先hash转化为一个64bit的长整数, 然后再映射到File_maping中, 以一个64bit的offset来表示实际存储的位置.
将所有的数据分解为两大类, 有hash冲突的, 无哈希冲突的,然后分别处理,
无哈希冲突的, 2个64比特就足够表示, 考虑hash冲突有可能对于多数记录都不存在,  因此多数记录都不需要保存主字段,  只占用16个字节就可以完整表示一个记录的位置, 占用内存空间比较少,  32G内存就肯定可以处理20亿的记录,
出现hash冲突后, 读取冲突的旧数据, 重新写入另外的数据结构中, 这部分数据结构中主要是 包含了主字段
总之, 就是代码复杂, 并且与下层的File_mapping的存储结构耦合. 要额外增加一些只读IO.

2) MVCC的处理: 要简化掉,
初期的设计中, 考虑到MVCC的并发情况, 因此, 对于每个数据记录都要有多个版本的记录, 并且正在更新的原始记录中还要有连接号,  那么SELECT查询就很复杂, 这部分代码对多版本的处理部分, 目前看做的比较复杂, 从已经写的代码看, 比预想的要复杂的多, TODO:的内容也比较多, 这部分代码准备要大块的暂时取消掉, 隐藏掉.

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
88 [报告]
发表于 2016-08-17 14:06 |只看该作者
本帖最后由 yulihua49 于 2016-08-17 14:14 编辑
wlmqgzm 发表于 2016-05-08 15:14 [/sizuoe]
准备开发一个高性能KV数据库, 类似MongoDB这样的, 学习MongoDB leveldb innodb,只是一个练手贴,  记录一下 ...

费好大劲只做KV数据库?检索功能用户需求很多啊,超过KV。
1.范围检索问题,>=某值 AND <=某值。
2.结果集问题。一个查询结果是个集合。
3.条件集,查询条件是集合。

网络问题,一次网络交换一个KV,注定效率不高。必定要支持集合(结果集,批量操作)才有效率。
例如,给你1000个KEY,你告诉我哪些已存在。
         给你1000个记录,按其KEY,如不存在则插入,存在则修改。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
89 [报告]
发表于 2016-08-17 23:11 |只看该作者
本帖最后由 wlmqgzm 于 2016-08-18 00:02 编辑

最近一段时间忙坏了, 孩子先后2次住院, 感冒引发的肺炎,  仅第一次住院27天花了6.2万.  然后, 又是家里其他成员住院, 现在还在医院.

我这个练手的代码, 今天终于有时间, 继续弄了半天, 主要增加了 无锁队列的一部分功能, 新增加的功能点, 主要是与io_service的协调, 自动处理,  当定义2项后,  只需要push数据, 然后消费者会自动处理数据, 生产者会自动处理返回结果
测试了速度,  spsc 1:1的 无锁队列性能上达到了每秒800-1200万QPS,  对比io_service的1:1任务调度性能大约是每秒300万-400万QPS. 性能上大约3倍的性能

template<typename T,unsigned int N=WAIT_FREE_MPSC_QUEUE_DEFAULT_SIZE>
class  Wait_free_mpsc_queue_io_service
{
  public:
     Wait_free_mpsc_queue_io_service( void );
     bool  push( std::shared_ptr<T>  sp_in, unsigned int uint_ios_num );  // 生产者调用
     bool  pop(  std::function<void(T*)>  function_in  );
     unsigned int   pop_all(  std::function<void(T*)>  function_in  );
     T*        pop_begin(  void );
     void   pop_end( void );
     unsigned int size( void );
     bool  empty( void );     //  消费者调用
     bool  full( unsigned int uint_ios_num );  // 生产者调用
     bool  is_lock_free( void );
     void   push_done( std::shared_ptr<T>  sp_in, unsigned int uint_ios_num );  // 队列空则很快,  如果队列满, 将循环直到push成功, 一般不推荐,消耗资源比较多

     //  以下为io_service的新增自动处理函数,
     void   push_with_io_service( std::shared_ptr<T>  sp_in, unsigned int uint_ios_num );     //  生产者调用,  数据队列满会自动将push放到io_service任务队列尾,  过会再试,  直到push成功, 推荐, 效率比较高
     // 当定义下列前2项后,  只需要push数据, 然后消费者会自动处理数据, 生产者会自动处理返回结果
     void   set_fuction_pop_process_and_io_service( std::function<void(T*)>  function_in, unsigned int uint_ios_num );  //  设置一个消费者函数和ios
     void   set_fuction_after_push_before_free_and_io_service( std::function<void(std::shared_ptr<T>)>  function_in, unsigned int uint_ios_num );     //  设置生产者回调函数和生产者ios

  private:
    unsigned int  d_uint_last_pop_ios_num;
    unsigned int  d_uint_ios_pool_count;
    std::vector<std::shared_ptr<Wait_free_spsc_queue_io_service<T,N> > >  d_vt_sp_spsc_queue;
    std::vector<unsigned int>  d_vt_ios_num;
};

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
90 [报告]
发表于 2016-08-17 23:24 |只看该作者
yulihua49 发表于 2016-08-17 14:06
费好大劲只做KV数据库?检索功能用户需求很多啊,超过KV。
1.范围检索问题,>=某值 AND


同意你的观点, 确实KV数据库用不了这么费事, 检索功能用户需求更多,
今后后面也是想开发一个正规的数据库, 但是代码量实在太大了, 只能一步一步来.
目前 先做KV数据库, 以后再扩充功能, 这个是个人开发的业余项目, 各类资源和时间都有限, 所以, 为了有一个验证方案的机会, 只能先从简单的项目做起.

主要还是通过这个项目练手, 提高自己的能力, 主要侧重的方向是高并发高性能方向C++编程, 积累一些技术方案, 并且测试一些比较新的架构设计思路.
所以, 有时候会在一些比较细枝末节的地方反复的抠, 就是为了积累一些技术经验
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP