数据密集型应用系统设计——笔记

本文是《数据密集型应用系统设计》的读书笔记,主要探讨了数据密集型应用的特征,区分了数据密集型与计算密集型应用。内容涵盖数据系统的可靠性(包括硬件故障、软件错误和人为失误的处理)、可扩展性(垂直扩展、水平扩展和自动弹性扩展)和可维护性(包括系统设计原则和运维策略)。此外,还深入讲解了数据存储和检索,尤其是哈希索引、SSTables、LSM-Tree和B-tree在数据存储中的作用和性能优化策略。
本篇章内容为阅读《数据密集型应用系统设计》一书的读书笔记。
作为个人成长学习使用,同时希望对刷到的朋友有所帮助,一起加油哦!

生命就像一朵花,要拼尽全力绽放,芳香四溢,在风中舞蹈!

写在前面:

为什么读这本书?

作为刚踏入数据库行业的初学者,我心怀憧憬地迎接这个新的挑战,并未料到工作中竟有机会遇到一位深具经验的导师,值得我万分庆幸。正是这位资深大佬热情推荐这本书给我,才让我真正接触到了它的魅力。第一章的阅读让我感到震撼,书中所探讨的内容令我大开眼界。其中蕴含着丰富的知识点,需要细致品味,耐心思考。

这本书并不枯燥,而是以其别出心裁的插图点缀其间。有些插图更是妙趣横生,将技术层面展示得更加清晰易懂;而其他一些插图则简直堪比艺术品,令人陶醉其中。当我阅读时,作者的表达方式也同样令我深感喜爱。他用朴实诚恳的语言贯穿全文(在我阅读的过程中,我真切地感受到他的诚意),将与数据相关的知识点从整体到局部、由浅入深地分析讲解,无微不至。他的用心与良苦想必是为了将更多的知识传授给我。

在此,我真心感谢我的导师和作者Martin Kleppmann。为回报他们的悉心指导与付出,我决定全力以赴地阅读这本书,并尽可能地撰写优秀的读书笔记,以期能够融会贯通、吸收更多的精华知识。

第一部分 数据系统基础

(图太美了,不得不贴)

我的第一个问题:书名是《数据密集型应用系统设计》,那么首先需要清楚一个概念,什么叫数据密集型应用?(第一章有答案)

数据密集型应用——数据(数据量、数据复杂度、数据变化速度)是主要挑战的这类应用。

计算密集型应用——CPU处理能力是第一限制性因素,计算量大,主要以追求计算速度为主要指标的这类应用。

1可靠、可扩展与可维护的应用系统

1.1 认识数据系统

本书认为数据系统的范围包括:数据库、队列、高速缓存等。

原因:

  • 这些用于数据存储和处理的各种工具,不再适合归类为传统系统。

  • 单个工具已经不能满足应用系统需求,需要分解任务,由每个工具高效完成各子任务,并依靠应用层代码有组织的衔接起来。

示例:

大多数软件系统都极为重要的三个问题:

  1. 可靠性:系统在某些错误(硬件问题、软件故障、人为失误等)情况下仍能正常工作;

  1. 可扩展性:系统有合理方式匹配规模(数据量、流量、复杂性等)增长;

  1. 可维护性:系统的开发和运维易于掌握。

1.2 可靠性

定义

  • 可能出错的事情称为错误或故障;

  • 系统可应对错误称为容错或者弹性;

  • 容错总是指特定类型的故障,有范围约束;

  • 故障与失效不同:故障通常指组件偏离其正常

### 哈希的基本定义 哈希(Hash)是一种将任意长度的输入(通常称为“键”或“Key”)通过一个特定的数学函数转换为固定长度的输出(通常称为“哈希值”或“Hash Value”)的过程。这种转换的核心工具是**哈希函数**(Hash Function)。哈希函数的设计目标是尽可能高效地将输入映射到一个唯一的输出值,并且在实际应用中尽量减少冲突[^1]。 ### 哈希的工作原理 1. **哈希函数的作用** 哈希函数的核心功能是将输入数据(如字符串、数字等)映射到一个有限的范围内,通常是一个整数区间。例如,在哈希表中,哈希函数将键映射为数组的索引,从而实现快速的数据存取操作。常见的哈希函数包括直接定址法和除留余数法等[^4]。 2. **均匀分布与冲突** 哈希函数的设计需要满足以下原则: - 哈希函数的定义域必须包括所有可能的输入键。 - 哈希函数的值域应限制在存储空间(如数组大小)的范围内。 - 哈希函数计算出的地址应该尽可能均匀分布在整个空间中,以减少冲突。 - 哈希函数的计算过程应尽可能简单,以提高效率[^2]。 然而,由于哈希函数的输出范围有限,而输入范围可能非常大,因此不可避免地会出现**哈希冲突**(即不同的输入产生相同的哈希值)。这种情况需要通过额外的机制(如链表或开放寻址法)来处理[^1]。 3. **应用场景** 哈希技术广泛应用于多种场景,包括但不限于: - **字符串匹配**:通过计算字符串的哈希值,可以快速判断两个字符串是否相等。 - **数据存储**:哈希表(Hash Table)利用哈希函数实现高效的查找、插入和删除操作。 - **分布式计算**:在一致性哈希算法中,哈希技术用于均衡负载并优化资源分配。 - **查重**:在文件系统或数据库中,哈希用于检测重复数据[^3]。 4. **滚动哈希与双重哈希** 在字符串处理中,**滚动哈希**(Rolling Hash)是一种常用的技术,它允许在滑动窗口中快速更新哈希值,从而提高字符串匹配的效率。此外,**双重哈希**(Double Hashing)则是一种解决冲突的方法,通过使用两个不同的哈希函数来生成更均匀的分布,从而降低冲突的概率[^3]。 ### 哈希表的实现 哈希表(Hash Table)是哈希技术的一个典型应用。它通过哈希函数将键映射到数组中的索引位置,并在该位置存储相应的值。如果发生哈希冲突,则可以通过链表、开放寻址法等方式进行处理。为了保持哈希表的高效性,通常会在负载因子(即存储元素数量与数组容量的比值)达到一定阈值时进行扩容,以避免性能退化[^1]。 例如,一个简单的哈希表实现如下: ```python class HashTable: def __init__(self, size): self.size = size self.table = [[] for _ in range(size)] def _hash(self, key): return hash(key) % self.size def insert(self, key, value): index = self._hash(key) for pair in self.table[index]: if pair[0] == key: pair[1] = value return self.table[index].append([key, value]) def get(self, key): index = self._hash(key) for pair in self.table[index]: if pair[0] == key: return pair[1] return None ``` ### 哈希函数的选择 选择合适的哈希函数是哈希技术的关键。常见的哈希函数包括: - **直接定址法**:适用于键的分布已知且连续的情况,形式为 `Hash(Key) = A * Key + B`。 - **除留余数法**:适用于键的分布未知的情况,形式为 `Hash(Key) = Key % m`,其中 `m` 是哈希表的大小[^4]。 此外,还可以结合滚动哈希和双重哈希技术,以进一步提升性能并减少冲突。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值