今天天气不算太好一直下雨,结果今天还是满课——早八到晚七。不过让我开心的是我的书——IDE(《数据密集型应用系统设计》,Designing Data-Intensive Applications)终于到了,据 AI 说是程序员的"圣经"。我反正想着晚上也没事,就来图书馆泡着了,我本来想着把 Docker 镜像、哈希索引、SSTables 和 LSM-Tree 一起学了的,不过还是小看了 IDE 的威力。我差不多花了一个半小时才搞明白。
进入正题,我将用我自己的理解和文字去阐明哈希索引里面蕴含的东西,以及揭开它的神秘面纱。
什么是哈希索引?它的作用是什么?
哈希索引的学术解释是:基于键值(Key-Value)对储存数据的结构。通过哈希函数,将键(Key)直接映射到表中的一个位置来访问记录,从而实现 O(1)(即瞬间)的读写速度。
让我用大白话一步一步解释里面的蕴含的道理。
假如你来到图书馆里面想要找《三体》,如果你比较喜欢图书馆里的氛围,想要多呆一会,你可以一个书柜一个书柜的寻找。如果你像我一样是《三体》的粉丝的话,肯定是想要迫不及待的看到这本书。那么,为了快速的找到这一本书,就可以通过图书馆里面的特定传送门直接拿到你心心念念的《三体》了。当然也有其他想看别的书的人,他们也可以通过特定的传送门去找到他们想要的书。这些无数个传送门组成的就叫做哈希索引了。
哈希索引就是图书馆里面传送门的组合,它的作用就是让你快速的拿到你想要的东西。
Key(键)和 Value(值)的关系是什么?
很简单,Key 就是你的身份证号码,Value 是你本人,警察叔叔可以通过公安系统(哈希索引)直接通过身份证号码就可以找到你。
哈希索引的核心架构
(1)磁盘储存:采用追加写入磁盘日志文件
每次更新将键值追加到末尾。旧数据保留但标记无效。
这句话的主要意思就是:如果你只有 5 个键值(1-5 表示),但是有 10 个文件。于是你上午先存入了 5 个文件(A-E),这个时候键值和文件是对应关系(你可以理解为 1-A、2-B)。到了下午,你又把剩下的 5 个文件(a-e)存了进去,这个时候键值的对应发生了变化——键值指向了下午存入的 5 个文件(1-a、2-b、3-c)。这个时候上午存的文件还在,可是原来的对应关系(1-A、2-B、3-C)失效了。这个时候你输入 1,输出就变成了 a。
(2)内存索引:维护一个哈希表
Key:数据的键。
Value:数据在磁盘文件中的字节偏移量及数据大小。
这下突然冒出来"偏移量"很多人就犯糊涂了,我一开始也是这样。让我给你好好讲讲这个突然出现的"偏移量"是个什么东西。
假设,Key 是一个公司里的职位——CEO,A 是 CEO,它有一个工牌(Value),上面记载了它的主要信息,就像是这样 Value(15 楼,办公室 1)。由于 A 到年纪要退休了,于是把位子让给 B。但是 B 不喜欢原来的办公位子,于是换了办公地点到 20 楼的第 6 个办公室,那么它的工牌也改成了 Value(20 楼,办公室 6)。你看职位是不是依旧是 CEO,不会因为人员变动而改变。但是工牌会,那么这个改变的量(Value 括号后的东西)就是偏移量了。
哈希表、哈希函数、哈希值、哈希索引的关系
看着很相似,其实用一个例子就可以捋清楚了。
我们都网购过,也都领过快递。其中一个取件码对应一个包裹(哈希索引)是我们心知肚明的真理了。那么,在这个快递到你手里经过了哪些流程呢?
第一步,快递到了驿站,老板(哈希表)拿着 POS 机(哈希函数)按照客户的手机尾号(Key)给你的快递贴上了一个取件码(哈希值)。然后把取件码发送到了你的手机上,你于是凭着取件码(哈希表)去对应的柜子里找。真正去过快递的都知道,里面的包裹并不是严格按照先后顺序排布的。(理想:1001、1002、1003……;结果现实则是:1001、1103、1045、1003……)这个则体现了哈希表的另一个特点——无序性。就是老板可能不是按顺序放的,你也不是按照顺序拿的(就像两个包裹 4-2-1000,1-1-1000;其中 4-2-1000 离你近你肯定先拿,不会按照顺序 1 到 4 的顺序拿吧)。
以上就是我的内容了,理解起来可能有门槛,希望我的博客可以帮助到你。