每一种数据存储系统,对应有一种存储模型,或者叫存储引擎。咱们今天要介绍的是三种比较流行的存储模型,分别是:redis
一、Hash存储模型数据库
二、B-Tree存储模型缓存
三、LSM树存储模型异步
Hash存储模型其实就是HashMap(哈希表)的持久化实现。这种模型的特色是与HashMap有密切关系的。咱们知道HashMap能够支持:put(key)增长/修改、delete(key)删除、get(key)随机获取操做,可是HashMap不支持get(1)这样的操做。由于HashMap是无序的,不支持顺序扫描。针对put、get操做,它的时间复杂度是O(1),也就是说读写速度都很快,因此针对单个Key的操做是很是快速的。若是咱们在应用中无需遍历数据,Hash引擎是很是合适的。学习
首先,经过key,找到对应的文件编号。这个检索的过程,是经过HashMap来实现的。线程
其次,经过文件编号找到存储中的文件日志
再者,经过value长度和位置找到对应的行数据blog
最后,读取出value内容索引
B-Tree存储模型因为是树状结构存储,因此,它是不支持随机读写的。就像咱们学习二叉树时,查找数据得经过遍历树的方式来查找数据。内存
上图是一种典型的B-Tree存储索引。叶子节点保存了每行的完整数据,非叶子节点保存了索引信息。数据在每一个节点都是有序存储的,但查询数据的时候,须要从根节点遍历,而后根据二分查找直到找到叶子节点。若是数据再也不内存中,须要从磁盘中读取,并加载到缓存。B+树的根节点是常驻内存的,最多须要h-1次磁盘IO,复杂度为O(h) = O(logdN)。修改操做首先要记录提交日志,而后在修改内存中的B+树。
LSM树的思想很容易理解,就是将数据的新增、修改增量数据先保存在内存中,到达指定的大小限制后将修改操做批量写入到磁盘。读取时,须要合并磁盘中的历史数据和内存中最近的修改操做。LSM的优点在于有效地随机写入问题,但读取可能须要访问较多的磁盘文件。