http://www.cnblogs.com/iamzhaiwei/archive/2012/09/02/2689653.html

单机存储100亿大数据量的key-value数据,要求能够支持插入和查询操作,单条数据长度不定,平均约1024字节,假设可用内存10G,磁盘空间不限,请设计一个存储查询模块,支持按照key来获取对应的value,设计目标以查询性能为先,尽量节约资源,查询可以理解为网民的检索行为。

1)        说明该设计方案和主要思路,以及优缺点

2)        请详细说明该设计思路下查询和插入的操作流程

3)        如果增加更新操作,请评估前面的设计方案是否可行,需要做怎样的修改,不可行则指明主要问题点。

分析:

1)数据量大小为:

data_size=100亿*1024Byte=10^10*10^3Byte=10^13Byte=10^4G

假设每个key的长度不超过128Byte。

使用2种文件存储数据:索引文件和数据文件。

索引文件采用类似B+树的结构化存储,一条数据对应一条记录,一条记录包括:数据的key、存储该数据的数据文件ID以及数据文件偏移量,占用空间:

record_size=key_size+data_file_ID_size+offset_size=128+4+8=140Byte。

B+树共有3层,内节点只存储最多M个关键字key和相应的M棵子树的位置,第i个关键字是第i棵子树中的最小关键字,叶节点存储最多M个key-value数据。每个节点最多包含M个key,M^3=100亿=10^10,M=2200。

内节点有2种形式:一是存储在索引文件中,包含的域有:关键字key,相应的子节点的索引文件ID和文件偏移量,占用空间:

inner_node_size_in_file=(key_size+index_file_ID_size+file_offset_size)*M=(128+4+8)*2200

=30800Byte=300K。

二是存储在内存中,除了上面提到的域,还包括指向子节点的指针域,占用空间:

Inner_node_size_in_memory*M=(inner_node_size_in_file+pointer_size)*M

=144*2200Byte=316800Byte=310K。

第一层和第二层占用空间:

(M+1)*inner_node_size_in_momery=666M,

可以全部存储在内存中。

内节点按顺序写入索引文件,采用惰性空间分配策略,即使内节点没有满,也分配最大空间inner_node_size_in_file。这样保证内节点可以在原地更新,保持有序状态。假设索引文件最大index_file_size=2G,一个索引文件可以容纳内节点数目:

Inner_count_in_file=index_file_size/ inner_node_size_in_momery

=6990>inner_node_count=M+1

一个索引文件足够了。

叶节点包含key-value数据,占用空间:

Leaf_size_in_memory=M*data_size=2200*1024=2200K

叶节点以在文件尾追加方式写入数据文件,不需要保持有序,因为B+树的第二层内节点记录了所有叶节点的数据文件ID和文件偏移量。假设一个数据文件大小是data_file_size=2G,数据文件数目为

data_file_count=data_size/data_file_size=5000

优点:

1)      B+树采用3层,第1层和第2层是内节点,是索引节点,存储在索引文件,可以全部存储在内存,第3层是叶节点,存储在数据文件,部分缓存在内存。插入和查找一条数据,最多需要访问硬盘一次。

2)      索引文件采用惰性空间分配策略保证内节点可以在原地更新,保持有序状态。

3)      数据文件的更新一直是在尾部追加,不需要移动数据。

缺点:

1)      索引文件浪费了部分空间。

第二问:

查找:在根节点二叉查找关键字,下降到第二层某一个节点,二叉查找关键字,下降到第三层某一个关键字,若该条数据不在内存中,从数据文件读入,若在内存中,直接返回数据。

插入:与查找类似,找到该条数据应该在的位置,添加到最后一个数据文件的末尾。

第三问:若增加更新操作,前面的方案可行,需要做下列修改:

将数据按照大小分类存储到不同的数据文件中。假设数据大小平均分布在512Byte到1536Byte之间,步长平均为128Byte,数据文件分类为存储512Byte的,存储512+128Byte的,存储512+128*2Byte的,……,类似内存池的做法。更新数据时,将数据写到能容纳该条数据的最小分类的数据文件,将该位置记为空闲,加到该数据文件的空闲位置链表。链表的指针可以用空闲位置的前4个字节表示,文件的最开始4个字节表示链表头部指针。当然,这样会浪费部分空间。可以监控每种文件的空间使用情况,做出调整。

设计海量key-value数据的存储查询模块相关推荐

  1. TableStore: 海量结构化数据分层存储方案

    2019独角兽企业重金招聘Python工程师标准>>> 前言 表格存储是阿里云自研分布式存储系统,可以用来存储海量结构化.半结构化的数据.表格存储支持高性能和容量型两种实例类型.高性 ...

  2. 海量视频监控数据存储和管理是大数据最重要的命题

    海量视频数据的存储和管理 维基百科全书的定义:"大数据是飞速增长的,用现有数据库管理工具难以管理的数据集合".这些数据包括:社交媒体.移动设备.科学计算和城市中部署的各类传感器等等 ...

  3. java设计一个查询模块_采用Java实现的汉语拼音查询模块

    0引言现有管理信息系统的数据库中存储了大量的中文信息,中文信息的检索是MIS的重要功能,对于中文字段的常见查询方法是输入汉字字符串,但是此方法需要过多的击键次数,例如,查询人名为"王晓明&q ...

  4. Shopee ClickHouse 冷热数据分离存储架构与实践

    本文首发于微信公众号"Shopee技术团队". 摘要 Shopee ClickHouse 是一款基于开源数据库 ClickHouse 做二次开发.架构演进的高可用分布式分析型数据库 ...

  5. 海量时序数据低成本存储架构设计

    导读 近些年来得益于传感器技术.无线网络技术.云计算和人工智能技术的发展,物联网的基础设施日益完善,并应用到了新能源.智能家居.车联网.智慧工业等众多领域中,实现了"人与物".&q ...

  6. 万亿级日志与行为数据存储查询技术剖析

    http://www.sohu.com/a/126082450_355140 目前大数据存储查询方案大概可以分为:Hbase系.Dremel系.预聚合系.Lucene系,本文作者将就自身的使用经验说说 ...

  7. 各式结构化数据 动态-接入-存储-查询 的处理办法 (第一部分)

    各式结构化数据的动态接入存储查询,这一需求相信有很多人都遇到过,随着实现技术路线选择的不同,遇到的问题出入大了,其解决办法也是大相径庭.数据存储在哪儿,是关系型数据库,还是NoSQL数据库,是MySQ ...

  8. 万亿级日志与行为数据存储查询技术剖析(续)——Tindex是改造的lucene和druid...

    五.Tindex 数果智能根据开源的方案自研了一套数据存储的解决方案,该方案的索引层通过改造Lucene实现,数据查询和索引写入框架通过扩展Druid实现.既保证了数据的实时性和指标自由定义的问题,又 ...

  9. key设计 短信验证存redis_Redis存储Key的一种设计实现方式:模式匹配

    一.前言 Redis是Key-Value数据库,存储的时候需要一个唯一的Key值,查询的时候根据根据key值进行查询,但是Redis毕竟只是key-value存储,所以有很多局限性.例如: (1)无法 ...

最新文章

  1. 03-VTK基础概念(2)
  2. “比特币耶稣”罗杰·沃推特赠币,留下BCH钱包地址就有份
  3. 如何更改mysql的授权信息_Mysql 的用户权限等操作管理与设置(创建、授权、修改、查看)...
  4. virtuoso根据原理图绘制版图并联接_版图绘制及Virtuoso软件工具使用.ppt
  5. android标题栏的属性,android – 属性“titleTextStyle”已经定义?
  6. 学习Python可以从事哪些工作?
  7. 编写批处理文件编译.Net工程
  8. C++ using关键字作用总结
  9. 计算理论笔记 10月10日
  10. 拓端tecdat|R语言空气污染数据的地理空间可视化和分析:颗粒物2.5(PM2.5)和空气质量指数(AQI)
  11. MD文本编辑工具推荐-matktext
  12. node.js 安装详细步骤如下(win 版)
  13. 如何彻底的卸载干净Oracle 11g
  14. 火狐浏览器和IE的CSS区别
  15. Android 同一个广播接收到两次
  16. 共享局域网与交换局域网
  17. vue.js 我在看别人的vue项目的时候,路由配置的path 路径 里面为什么有hidden:true/false
  18. 程序员的-多做多错,少做少错,不做不错
  19. 文档 盖章 java_文档自动盖章
  20. 漏洞扫描器 - OS识别 - TTL与Nmap方式

热门文章

  1. Python与常见加密方式
  2. 工作之后,顶会还重要嘛?
  3. 基于句子嵌入的无监督文本摘要(附代码实现)
  4. AAAI 2019 Oral | 把Cross Entropy梯度分布拉‘平’,就能轻松超越Focal Loss
  5. ECCV 2018最佳论文解读:基于解剖结构的面部表情生成
  6. pytorch datasets.ImageFolder,DataLoader形成的tensor是什么样的?
  7. 使用格式工厂把视频进行旋转
  8. 【Java代码】反射机制处理传递给mapper文件的非Map类型参数对象(指定属性为空则设置默认值)
  9. python算法攻略_算法基础及python实现笔记一(堆和DFS)
  10. Struct2中三种获取表单数据的方式