LSM-Tree 如何加速随机写
引言 ​
LSM-Tree(Log Structured Merge Tree),它是一种分层、有序、面向磁盘的数据结构。主要利用了磁盘批量的顺序写性能远胜于随机写的特性,对数据的操作均采用追加方式,不进行删除和更新。但是该设计在大大提升了写性能的同时降低了读性能。
✍️
LSM-Tree(Log Structured Merge Tree),它是一种分层、有序、面向磁盘的数据结构。主要利用了磁盘批量的顺序写性能远胜于随机写的特性,对数据的操作均采用追加方式,不进行删除和更新。但是该设计在大大提升了写性能的同时降低了读性能。
相较于c的字符串,有三点优点:
len
属性记录了长度,时间复杂度o(1)
mysql的连接方式有三种:TCP,IP和命名管道与共享内存 ,unix
很多NoSQL数据库有无模式的共同点。若要在关系型数据库中存储数据,首先必须定义模式
,也就是用一种预定义结构向数据库说明要有哪些表格,表中有哪些列,每一列都存放何种类型的数据。必须先定义好模式,然后才能存放数据。
相比之下,NoSQL数据库的数据存储就比较随意。键值数据库
可以把任何数据存放在一个键的名下。文档数据库
实际上也如此,因为它对所存储的文档结构没有限制。在列族数据库中,任意列里面都可以随意存放数据。你可以在图数据库
中新增边,也可以随意向节点和边中添加属性。
argparse
是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse
模块的作用是用于解析命令行参数。
Counter是一个dict子类,主要是用来对你访问的对象的频率进行计数。 常用方法:
在现代程序开发中,理解函数调用栈的工作原理是非常重要的,尤其在调试和优化代码时。函数的调用不仅是一个逻辑的执行过程,它背后还涉及到内存管理、寄存器操作、汇编指令的生成以及栈帧的动态维护。通过分析函数调用栈,开发者能够深入了解程序的底层运行机制,识别并解决性能瓶颈或潜在的错误。下面,我们通过一个简单的 C++ 代码示例,从汇编指令的角度详细解读函数的调用过程
const char*p = "hello world"
, *p就是放在只读段,不可修改。预编译->编译->汇编->二进制可重定位目标文件
链接
单例模式:一个类不管创建多少次对象,永远只能得到该类型一个对象的实例。
常用的:日志模块、数据库模块
饿汉式单例模式:还没有获取实例对象,实例对象就已经产生了
懒汉式单例模式:唯一的实例对象,直到第一次获取它的时候,才产生
饿汉式一定是线程安全的;但是会延长软件的启动时间
万字长文解析kafka:https://mp.weixin.qq.com/s/dOiNT0a_dRytwatzdrJNCg
kafka日志存储:https://zhuanlan.zhihu.com/p/65415304
用途:不同服务server、进程process、线程thread之间进行通信。
使用消息队列的场景:
Leetcode: https://leetcode.cn/problems/lru-cache/description/
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache
类:
LRUCache(int capacity)
以 正整数 作为容量 capacity
初始化 LRU 缓存int get(int key)
如果关键字 key
存在于缓存中,则返回关键字的值,否则返回 -1
。void put(int key, int value)
如果关键字 key
已经存在,则变更其数据值 value
;如果不存在,则向缓存中插入该组 key-value
。如果插入操作导致关键字数量超过 capacity
,则应该 逐出 最久未使用的关键字。函数 get
和 put
必须以 O(1)
的平均时间复杂度运行。
找到最大值是最简单的部分,只需要遍历数组一次,记录最大的值。
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
arr = [1,2,3]
,以下这些都可以视作 arr
的排列:[1,2,3]
、[1,3,2]
、[3,1,2]
、[2,3,1]
。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
arr = [1,2,3]
的下一个排列是 [1,3,2]
。arr = [2,3,1]
的下一个排列是 [3,1,2]
。arr = [3,2,1]
的下一个排列是 [1,2,3]
,因为 [3,2,1]
不存在一个字典序更大的排列。给你一个整数数组 nums
,找出 nums
的下一个排列。
必须 原地修改,只允许使用额外常数空间。
给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
快速排序(Quicksort)是一种高效的排序算法,采用分治法策略。以下是使用 Go 语言分别实现递归和非递归版本的快速排序。
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
https://zhuanlan.zhihu.com/p/608787533
Io_uring 利用 mmap 开辟出一块空间,让用户态和内核态的程序都可以共享的一块区域
在编译过程中,没有函数的调用开销了,在函数的调用点直接把函数的代码进行展开处理了。
不是所有的inline都会被编译器处理成内联函数,比如“递归”。
inline只是建议编译器把这个函数处理成内联函数。
debug版本上,inline是不起作用的;inline只有在release版本下才能出现。符号表中不生成符号了。