Hash存储模型、B-Tree存储模型、LSM存储模型介绍
每一种数据存储系统,对应有一种存储模型,或者叫存储引擎。我们今天要介绍的是三种比较流行的存储模型,分别是:
- Hash存储模型
- B-Tree存储模型
- LSM存储模型
不同存储模型的应用情况
1、Hash存储模型
- redis
- memcache
2、B-Tree存储模型
- MySQL(以及大多数的关系型数据库)
- MongoDB
3、LSM树存储模型
- HBase
- RocksDB
不同存储模型介绍
1、Hash存储模型
Hash存储模型其实就是HashMap(哈希表)的持久化实现。这种模型的特点是与HashMap有密切关系的。我们知道HashMap可以支持:put(key)增加/修改、delete(key)删除、get(key)随机获取操作,但是HashMap不支持get(1)这样的操作。因为HashMap是无序的,不支持顺序扫描。针对put、get操作,它的时间复杂度是O(1),也就是说读写速度都很快,所以针对单个Key的操作是非常快速的。如果我们在应用中无需遍历数据,Hash引擎是非常合适的。

首先,通过key,找到对应的文件编号。这个检索的过程,是通过HashMap来实现的。
其次,通过文件编号找到存储中的文件
再者,通过value长度和位置找到对应的行数据
最后,读取出value内容
2、B-Tree存储模型
B-Tree存储模型由于是树状结构存储,所以,它是不支持随机读写的。就像我们学习二叉树时,查找数据得通过遍历树的方式来查找数据。

上图是一种典型的B-Tree存储索引。叶子节点保存了每行的完整数据,非叶子节点保存了索引信息。数据在每个节点都是有序存储的,但查询数据的时候,需要从根节点遍历,然后根据二分查找直到找到叶子节点。如果数据不再内存中,需要从磁盘中读取,并加载到缓存。B+树的根节点是常驻内存的,最多需要h-1次磁盘IO,复杂度为O(h) = O(logdN)。修改操作首先要记录提交日志,然后在修改内存中的B+树。
3、LSM树存储引擎
LSM树的思想很容易理解,就是将数据的新增、修改增量数据先保存在内存中,到达指定的大小限制后将修改操作批量写入到磁盘。读取时,需要合并磁盘中的历史数据和内存中最近的修改操作。LSM的优势在于有效地随机写入问题,但读取可能需要访问较多的磁盘文件。

- Level 0 :日志/内存
- 先写入预写日志,再写内存
- 写入日志是为了保障可用性
- Level 1:日志/内存,当Level 0写入达到阈值,通过异步方式将部分数据刷写到硬盘上
- Level 2:合并,由于不断刷写会产生大量小文件,这样不利于管理和查询。需要在合适的时机启动一个异步线程进行合并操作生成一个大文件
Hash存储模型、B-Tree存储模型、LSM存储模型介绍的更多相关文章
- LSM存储模型
LSM存储模型 数据库有3种基本的存储引擎: 哈希表,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统.对于key-value的插入以及查询,哈希表的复杂度 ...
- 有关从经典部署模型迁移到 Azure Resource Manager 部署模型的常见问题
此迁移计划是否影响 Azure 虚拟机上运行的任何现有服务或应用程序? 不可以. VM(经典)是公开上市的完全受支持的服务. 你可以继续使用这些资源来拓展你在 Azure 上的足迹. 如果我近期不打算 ...
- 使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型
以下步骤演示如何使用 Azure 命令行接口 (CLI) 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 本文中的操作需要 Az ...
- [转帖]influxdb和boltDB简介——MVCC+B+树,Go写成,Bolt类似于LMDB,这个被认为是在现代kye/value存储中最好的,influxdb后端存储有LevelDB换成了BoltDB
influxdb和boltDB简介——MVCC+B+树,Go写成,Bolt类似于LMDB,这个被认为是在现代kye/value存储中最好的,influxdb后端存储有LevelDB换成了BoltDB ...
- 139、TensorFlow Serving 实现模型的部署(二) TextCnn文本分类模型
昨晚终于实现了Tensorflow模型的部署 使用TensorFlow Serving 1.使用Docker 获取Tensorflow Serving的镜像,Docker在国内的需要将镜像的Repos ...
- Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数
11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...
- 生成模型(Generative Model)与判别模型(Discriminative Model)
摘要: 1.定义 2.常见算法 3.特性 4.优缺点 内容: 1.定义 1.1 生成模型: 在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下.它给观测值和标 ...
- DL4NLP——词表示模型(二)基于神经网络的模型:NPLM;word2vec(CBOW/Skip-gram)
本文简述了以下内容: 神经概率语言模型NPLM,训练语言模型并同时得到词表示 word2vec:CBOW / Skip-gram,直接以得到词表示为目标的模型 (一)原始CBOW(Continuous ...
- 『高性能模型』Roofline Model与深度学习模型的性能分析
转载自知乎:Roofline Model与深度学习模型的性能分析 在真实世界中,任何模型(例如 VGG / MobileNet 等)都必须依赖于具体的计算平台(例如CPU / GPU / ASIC 等 ...
随机推荐
- 6、python基本数据类型之序列类型
前言:python的基本数据类型可以分为三类:数值类型.序列类型.散列类型,本文主要介绍序列类型及其通用操作. 一.序列类型 1)字符串(str):用单引号('),双引号("),三引号(三单 ...
- 大叔 EF 来分析 EntityFrameworks.Data.Core 1
Common 1SQL命令拦截器主要实现EF的读写分离 SqlCommandInterceptor 继承父类DbCommandInterceptor 2SQL锁选项SqlLock 3忽略大小写,作为C ...
- JavaScript学习之路1
1. 变量类型只有var var money=5; var house="big house"; 示例如下 <!DOCTYPE html> <html> & ...
- CSS-14-浮动
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 小程序--->scroll-view组件不能触发相应滚动事件
小程序scroll-view组件不能触发相应滚动事件 在制作加载更多时会发现不能触发相应事件,一般情况下首先要查看两个必要的属性scroll-view的高度是否设置,第二就是scroll-view的滚 ...
- Android教程2020 - RecyclerView实际使用
示例,用RecyclerView的item做出一个列表. Android教程2020 - 系列总览 本文链接 前面我们已经知道如何用RecyclerView显示一列数据.这里我们做出一个具体的例子.尽 ...
- centos7安装mysql5.5.62
mysql是我们最常用的开源的关系型数据库,mysql不同版本有时候安装的方式也不尽相同,下面梳理一下mysql5.5.62版本的安装 1.下载mysql5.5.62,URL:https://down ...
- Oracle监听器
Oracle 监听器 Listener 是一个重要的数据库服务器组件,在整个 Oracle 体系结构中,扮演着重要的作用.它负责管理 Oracle 数据库和客户端之间的通讯,它在一个特定的网卡端口(默 ...
- 含源码解析,深入Java 线程池原理
从池化技术到底层实现,一篇文章带你贯通线程池技术. 1.池化技术简介 在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能. 在编程领域,比较典型的池化技术有: 线程池.连接池.内存池 ...
- Win10系统下如何将中文登录名改为英文登录名
需求:本人每次在换完系统后是默认,图方便,登录名就直接是自己的名字,造成以后安装个别软件时会莫名其妙的出错. 解决办法: 1.在当前用户开始处-点击右键(Windows键+X)-注销 2.切换到Adm ...