编辑
2023-11-12
算法题
00

以下是八大排序算法的C++模板代码

cpp
#include <iostream> #include <vector> using namespace std;
编辑
2023-11-11
算法题
00
编辑
2023-11-11
linux
00

Linux信号的原理是进程间通信的一种机制,它是在软件层面上对中断机制的一种模拟。信号是异步的,进程不需要等待信号的到来,而是在进程内部设置与信号对应的处理函数,当信号到达时,系统会异步触发对应的处理函数。

  1. 信号的产生:
    • 信号可以由内核产生,也可以由用户产生。例如,用户在终端输入"Ctrl + C"时会产生一个SIGINT信号,程序中的除零操作会产生一个SIGFPE信号,非法访问内存会产生一个SIGBUS信号,还可以通过终端命令或程序调用kill函数来手动发送信号[1]
编辑
2023-11-11
Redis源码阅读
00

各种算法

![image.png](/static/img/5f57e9238283d833

编辑
2023-11-11
数据库理论基础
00

LSM树(Log-Structured Merge Tree)是一种存储结构,被广泛应用于许多NoSQL数据库,如HBase、LevelDB和RocksDB。LSM树的核心思想是通过顺序写来提高写性能,同时通过分层的设计来稍微降低读性能,从而实现高性能的写入操作。

LSM树由以下三个重要组成部分构成:

  1. MemTable(内存表):MemTable是存储在内存中的数据结构,用于保存最近更新的数据。它按照键(Key)有序地组织数据。不同的LSM树实现可能使用不同的数据结构来保证内存中键的有序性,例如HBase使用跳跃表(Skip List)。由于数据存储在内存中,因此需要通过预写式日志(Write-ahead Logging,WAL)来保证数据的可靠性[1]

  2. Immutable MemTable(不可变内存表):当MemTable达到一定大小后,会转化为Immutable MemTable。Immutable MemTable是将MemTable转换为SSTable(Sorted String Table)的一种中间状态。在转存过程中,不会阻塞数据更新操作[1]

  3. SSTable(有序键值对表):SSTable是存储在磁盘中的数据结构,包含有序的键值对。为了加快SSTable的读取速度,可以通过建立键的索引和使用布隆过滤器来加速键的查找。LSM树将所有的数据操作记录保存在内存中,当操作记录达到一定数量后,批量顺序写入磁盘。与B+树不同,LSM树的数据更新是以日志的形式进行的,每次数据更新都是追加一条更新记录。这样的设计可以实现顺序写入,只需将Immutable MemTable顺序写入持久化存储即可,而无需修改之前的SSTable中的键,从而保证了顺序写入的性能。因此,当MemTable达到一定大小并转存为SSTable后,不同的SSTable中可能存在相同键的记录,而最新的记录才是准确的[1]

LSM树的设计虽然大大提高了写性能,但也带来了一些问题:

  1. 冗余存储:对于同一个键,除了最新的记录外,其他记录都是冗余的且无用的,但仍然占用存储空间。因此,需要进行Compact操作来清除冗余记录[1]

  2. 读放大:在LSM树中进行数据查找时,需要从最新的SSTable开始逆向查询,直到找到目标键的记录。在最坏情况下,需要查询所有的SSTable。为了优化查找速度,可以使用索引和布隆过滤器[1]

下面介绍两种常见的LSM树的Compact策略: