leveldb原理-leveldb 核心原理
数据库这事儿,实际上就是个在生意场上用脑子存数据的活儿。
要是数据库再笨一点,内存大了也快满了,数据就存不下了,那业务就停摆。
故此核心思路就是:别动不动就寻思着把全量数据都塞进硬盘,而是得学会把数据分块、分片,再轮流跑起来。
这种思路,说白了就是 LeetCode 刷题时那种“分而治之”的算法思维,到了数据库这行当里,就成了读作:数据分区域,分区域轮流读,分时段读。 这就好比你开了一家裁缝店,你不可能明天早上就把昨天做的所有衣服重新打包、重新缝好,那样忒折腾了。你肯定是有节奏地干活:先处理昨天刚做完的,今天接着做;要么把衣服按款式分箱,今天做 A 款,明天做 B 款,最终再统一整理。LeetCode 里的分治算法跟这简直是一模一样。数据库里的读写策略,实际上就是干这个事儿的。 想象一下,你有个大仓库,东西忒多了,你得按区域分仓。
比如 A 区放数学题,B 区放语文题,C 区放英语题。每天你只去 A 区和 B 区找数据,C 区就空着。
这叫分块;接着,每天你只去 A 区找最新的数据,B 区去旧数据,这样循环。
这叫分片。
要是只按区域分,那数据一辈子不新鲜,昨天 A 区的题今天去 A 区也得找旧数据;要是只按工夫分,那 C 区的数据一辈子都是旧数据,对你没用。
故此得混着来:既按区域分块,又按工夫分时段。 这就有点费事了,出于得时刻记住:刚写完的数据,立马就得找出来;没写完的数据,得留着等会儿。LeetCode 写个函数,能直接写出来,那是一般/平平程序员的事;要是能写个稳定、高效的通用函数,那得费好几年。数据库写代码,目标不是为了写代码本身,而是为了写得好,让业务跑得顺顺当当。
故此,代码里得打通这个路子:写一个好办的函数能跑通,最好是通用、稳定、能处理小值和大值。 如何实现?先把数据分成几块。
比如你把数据切成 10 块,每块有 100 个元素。
然后,你有一张表,里面把 10 块的数据都存着。每天,你只读这 10 块里最新的那几块。
这叫分块;接着,你只读这 10 块里最新的那 2 块。
这叫分片。
要是只按块分,那每天 10 块都变;要是只按份分,那块里的数据一辈子是不新鲜的。混着来,既有块,又有份。 这就引出了另一个难题:分块和分片是如何配合的?这就接上文了。刚刚说的是按块分、按份读,目前想换个说法:按份分、按块读。
为啥?出于你要寻思业务量。假设你只拿 A 区里的最新数据,那 C 区的数据如何处置?
要么扔掉,要么等到 A 区满了再清空 C 区。但这有个风险:要是 C 区突然来了一个超级大文件,瞬间塞满,万一你还没来得及读取,文件就破了。
故此得有个缓冲:先读,遇到大文件就挂掉,等 A 区满了才清空 C 区。
这就像你在景区,景点 A 人多你挤不那会儿,就先绕开;等 A 区人走了,你再去 A 区。
这叫智能分流。 再看工夫维度。数据库的读写策略,核心是“读热写冷”。热数据就是时常用的、最新的;冷数据就是挺久没用、旧掉的。
如何定义热和冷?得看业务量。
比如一个股票软件,你每天查昨天的行情,那昨天的行情就是热数据;你查今年的数据,那今年的数据就是冷数据。
这就有个工夫窗口:比如你每天只查今天的数据,那今天的数据就是热数据。
这个工夫窗口得灵活:有的业务查今天、明天的,那今天、明天就是热数据;有的业务只查昨天,那只有昨天是热数据。
故此,工夫窗口得动态调整。 举个例子。假设你有一个电商数据库,商品数据分成了 5 个区域:服装、鞋类、箱包、家居、电子。你每天只读这 5 个区域里最新的 3 个区域的数据。
这叫分块;接着,你再只读这 3 个区域里最新的 2 个区域的数据。
这叫分片。再看工夫,你只查今天的数据。假设今天是周三,那今天的库存、今天的订单就是热数据。 但现实中,数据不是静止的。
比方说,你今天查了服装区的数据,明天你查鞋类区的数据。
这时候,服装区的旧数据、鞋类区的旧数据,就转变成了冷数据,启动等待新的业务来填充。
这就引出了另一个难题:冷数据到底该干啥?要是冷数据忒多,数据库就按不了新业务了;要是冷数据忒少,数据库就得拼命干活。
故此得有“缓冲”:要么让业务自己写冷数据,要么让系统定期把冷数据清理掉。 这就得看业务了。
要是你是电商,你每天只查今天的订单,那订单就是热数据,昨天的订单就是冷数据;要是你是股票软件,你每天只查今天的行情,那今天的行情就是热数据,明天的行情就是冷数据。但要是是医疗系统,你查出院费,那今天的出院费是热数据,昨天的出院费也是热数据,出于病人可能明天还要来。
故此,工夫窗口得根据业务来定。 还有一个细节:如何判断该写新数据,还是该写旧数据?这就涉及到了“写冷”和“写热”的策略。
比方说,你发现一个旧文件占用了忒多空间,你该不该删除它?这得看业务:要是是冷数据,删了也没事;要是是热数据,删了就影响业务。
故此,数据库得有策略:把旧数据先标记为冷数据,等赶明儿业务慢慢用,再慢慢清理;要是业务突然用,就赶紧清理掉。 那到底该分几块呢?
如何分?这得看数据库的表结构。
比如你有一个商品表,里面有商品名、价格、销量。你能够按商品名分块,比如按拼音分块;也能够按价格分块,比如低价区、中价区、高价区。你能够按销量分块,比如销量前 100 名、前 1000 名、前 10000 名。你还能够按工夫分块,比如最近 7 天、最近 30 天、最近 365 天。 然后,你得建张表,把分好的块都存着。
比方说,按商品名分块的表,存着每个商品名下的所有数据;按工夫分块的表,存着每个工夫段下的所有数据。
这就是分块和分片的结合。 再举个例子。你有一个视频存服务,视频分成了 10 个区域。你每天只读这 10 个区域里最新的 5 个区域的数据(分块);再只读这 5 个区域里最新的 2 个区域的数据(分片)。
与此同时,你只查今天的数据(工夫窗口)。
这样,只要你今天读新数据,旧数据就自动转变成冷数据,启动填充冷数据表。 但这里有个坑:要是你只读今天的数据,明天新数据来了,你得把旧的读出来。
这时候,旧的还是冷数据,但业务需求。
故此,系统得有个策略:把冷数据优先读,热数据优先写。 那到底啥时候清理冷数据?这得看你的业务。
要是你是电商,你能够设定:每天只查今天的订单,那昨天的订单就是冷数据,每天查完就清空冷数据表。
要是你是医疗,你可能查出院费,那昨天的出院费还是热数据,不直接清空,而是放到一个“待清理”列表里,等业务用完了再清理。 还有,分块和分片能够混合。
比方说,按商品名分块,但块的大小不一样:有的块小,有的块大;要么按工夫分块,但块的工夫段不一样:有的工夫段短,有的工夫段长。 那如何判断数据该读不该读?这就涉及到了“只读”和“读写”的策略。
比方说,你发现一个旧文件占用了忒多空间,你该不该删除它?这得看业务:要是是冷数据,删了也没事;要是是热数据,删了就影响业务。
故此,数据库得有策略:把旧数据先标记为冷数据,等赶明儿业务慢慢用,再慢慢清理;要是业务突然用,就赶紧清理掉。 最终得总结一下。LeetCode 分治算法,数据库读作:数据分区域,分区域轮流读,分时段读。核心是数据分块,分块受业务影响;数据分片,受数据影响;如何读取,得看热冷数据。数据分块和分片能够混合。工夫窗口得根据业务来定。冷数据得由业务自己写,要么系统定期清理。
总而言之,数据库读数据的策略,就是为了解决数据量大、更新快、旧数据占用的难题。通过灵活的分块、分片、工夫窗口,配合冷热数据策略,让数据库能持续、稳定、高效地干活。
声明:演示网站所有内容,若无特殊说明或标注,均来源于网络转载,仅供学习交流使用,禁止商用。若本站侵犯了你的权益,可联系本站删除。
