YJ-Ma的小屋❄️
源码:log_writer.cc。为了不丢失数据,需要持久化的功能。把数据持久化到磁盘上,最常用的技术就是日志技术,也就是当修改数据时,先把对数据的修改写到磁盘上,然后在MemTable里做修改。因为日志记录了每个操作,只要对日志进行重放便可以恢复MemTable,这样就做到了数据库实例崩溃、宕机或者停机维护的时候数据不丢失。这种日志技术在数据库里面很常用(Redis里的Aof,Innodb里的Redo Log都是这样的技术),一般称为WAL (Write Ahead Log),正如名字一样,就是在写入前先写入日志的意思。Put操作也不能简单的写入到 memtable,而是要先写日志、再写 memtable,都更新完成后再返回写入成功,write-ahead logging 名字也是由此而来。因为日志的写入都是Append的,也就是顺序写,所以写磁盘也是顺序写,虽然磁盘的随机写效率比较低,但是顺序写效率还是很高的,所以就算加入了日志,写效率还是很高,依然可以满足写多的场景。另外可以通过控制日志写同步的策略在性能和可靠性之间做折中:每次写入都做一次sync,可靠性最高,不会丢数据,但是性
设计MemTable是一个内存数据结构,简单说它就是一个SortedMap:MemTable是一个Map,提供了Get接口,也就是可以快速地根据键查找到值,也可以使用Put接口插入Kv。MemTable是Sorted,也就是里面存储的键都是有序的,可以按照键的顺序迭代Map,或者做范围查询。有了MemTable提供的Get和Put,就有了一个简单的内存Kv数据库,可以实现Kv的查询,插入和范围查询。Put,Delete,Update实际上都是一个Put。Update:等价于新插一个同样的key(LevelDB中没有Update)。Delete:将当前最新的key插入空,并且标志置为删除。因为MemTable是内存数据结构,不需要磁盘IO,所以读写的速度非常快,所以就达到了场景需求:高效的写性能。然而这会有个问题,当数据库实例崩溃、宕机或者停机维护的时候,存储的数据就会丢失,这时候需要持久化数据。class MemTable { typedef SkipList<const char*, KeyComparator> Table; KeyComparator comp
动静结合——编码 - 知乎参考源码util/coding.h util/coding.cc:编码实现的源代码定长整数32位和64位。变长整数1标识后面还有字节要读取,0表示结束。Slicelevel只保存字符串类型。无论字符串是英文还是中文,slice都是指向二进制的字符串,不关心中文英编码形式。至于打印,就是将slice指向的二进制传递给string进行打印。对于slice来说,它只关心二进制,至于解码打印或者比较,交给string。
Log(*.log):即Write Ahead Log,是用来记录LevelDB变更的append-only的文件,在LevelDB重启时用来恢复内存中的数据。MemTable、Immutable MemTable:用来Buffer最近写入的内存结构,其通过SkipList实现。当MemTable达到一定大小时会转为只读的Immutable MemTable,并等待后台线程通过Minor Compaction将其转为level-0的SSTable。MemTable是LSM-Tree将随机写入转为顺序写入的关键。SSTable(新:.ldb、旧:.sst):通过Compaction生成的SSTable。level-0的SSTable由Immutable MemTable直接转储得到,因此level-0的SSTable的key间存在overlap;其它level的SSTable每层间没有overlap。另外,除了level-0外,每层SSTable的总大小比上一层大10倍。Manifest(MANIFEST-*):记录SSTable文件等的版本变更,其中Record的格式与Log相同,Le
打开LevelDB每一个数据库有一个name,对应一个目录,所有的数据库文件都在这个目录里。通过Open可以打开或者新建一个数据库,得到数据库的引用,通过这个引用来操作数据库。可以这样打开一个数据库:leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);name指定数据库目录,options指定了打开数据库的选项,db获取了数据库的引用。这里使用了create_if_missing选项,当数据库不存在时会创建数据库。关闭只需要delete数据库实例即可:delete db基础APILevelDB的基础API有三个,分别是Get、Put和Delete,表示查询一个键、插入一个键和删除一个键。LevelDB没有更新操作,因为更新就是简单地插入一个Kv,会覆盖之前的值。db->Put(leveldb::WriteOpt
CppGuide/articles at master · balloonwj/CppGuide深入理解什么是LSM-Tree - 腾讯云开发者社区-腾讯云leveldb 日常使用安装:linux下leveldb的安装与编译Kilig_yo的博客-CSDN博客linux编译leveldb记录一次leveldb安装失败经历\_inoobkk的博客-CSDN博客源码解析深入分析LevelDB实现 - 惊雷123的专栏 - 掘金【推荐】leveldb\_草上爬的博客-CSDN博客【推荐】深入浅出LevelDB - 分类 - 叉鸽 MrCroxx 的博客【推荐】LevelDB Archive - Ying's Blog【推荐】SF-Zhou's Blog【推荐】LevelDB中文文档 - KevinsBobo Blogleveldb-handbook — leveldb-handbook 文档LSM-Tree - LevelDb 源码解析 - 掘金LevelDB源码剖析 - 知乎LevelDB - 文集 - 简书标签: leveldb | Calvin's MarbleslevelDB掘金收藏
任务规划每年元旦规划出今年要完成的任务,从阅读、计算机、金融、通识四个方向进行规划。根据年计划,制定出每个月要完成任务。根据月计划,制定出每周要完成的任务。每一个任务给出一个预计完成的天数。每一个任务要标记好主次,抓住重点。避免在不重要的细节上浪费时间。按模块深入学习。时间规划以一周为循环周期,规划好每天的时间安排。使用ORK进行任务管理,统计完成的情况。使用Vision创建OKR的步骤:使用Vision创建年、月两种迭代周期。年迭代周期的目标为四个:阅读、计算机、金融、通识。年迭代周期的关键结果不受严格的数量限制月迭代周期可以取消四种分类。可以用年迭代周期中的任务作为月关键结果。月迭代周期每个目标的关键结果控制再3个以内。周任务使用滴答清单管理OKR原则规划任务时要把任务量化,确保任务的合理性,在指定的迭代周期内时有可能完成。如果发现任务不合理要及时调整。反思:每个迭代周期完成后要进行复盘。进度跟进:一个周的任务结束后更新月迭代周期,一个月迭代周期完成后更新年迭代周期。要对目标和关键结果进行标优先级,时间不够时优先做优先级高的,砍掉优先级低的。执行任务使用番茄工作法,以1h、1.5h
ReferenceC语言函数栈帧实例程序编译后运行时的内存分配关于书上说的“编译的时候分配内存”内存中堆栈使用,函数调用示例c程序运行时的内存分配“在编译时分配的内存”的真正含义是什么?C/C中内存区域划分大总结上述函数的调用过程其实解释了静态变量和局部变量的分配过程。而关于动态内存的分配过程是使用malloc,参考以下文章:从操作系统内存管理来说,malloc申请一块内存的背后原理是什么?探秘malloc是如何申请内存的c语言 什么时候需要动态分配内存?从汇编层次理解malloc函数关联阅读:什么是堆栈和堆?程序执行大致过程程序被编译成二进制代码后放入硬盘。当程序执行时,将代码调入内存,放入内存的代码段。同时程序中的变量也会按变量类型在对应的内存段中分配内存。然后CPU会从代码段取出每一条指令进行执行。CPU在执行一条指令时,从指令中取出的是相对地址,需要经过寻址方式确定最终的逻辑地址。有了逻辑地址再经过地址映射找到逻辑地址对应的物理地址。那么问题是当被代码调入内存后,是什么时候为这个程序进行的内存分配?又是以什么样方式进行内存分配的?网上找到的答案如下:当执行这个EXE文件以后,此
我们没有回头路可以走。我想好了,我们的小说就叫--单程票。最开始在豆瓣看到这本书的时候并没有激发我想看它的兴趣。前些天去图书馆借书看,可是我想看的书全都没有。不知道怎么的,突然这本书的的名字就在我的脑海中出现。于是我抱着试一试的态度查了下,还真有。就这样,我又发现了一本好书,一本深入人心的好书。或许生活就是这样无独有偶。每当我在某一阶段有某些情绪时,生活总是能为我安排出合适的书,来增加我的人生阅历。而对于自己期待出现的人,生活是同样的安排。我感谢生活。与那些身处绝望的人比起来,我觉得我自己简直幸福的要命。一个不知国籍,从小吃百家饭长大的孤儿阿牧,和他所处环境的人一样,过着以偷盗为事业的生活。可以说在他的生活中没有半点的爱,半点希望未来,完全就是处于绝望中的人。不过说实话,我是真不认同那种以偷盗为事业人。但是,我的同理心告诉我。环境所逼,生活所迫,除此之外,别无他法。如果不以偷盗为事业或许只能把比偷盗更为过分的事情作为事业了。我设想自己如果自己是阿牧,我还会坚守自己现在的这套道德观吗?不,不会。我没有那么伟大,我也会把偷盗作为自己的事业让自己生存下去。让我不禁觉得,我自己所谓的道德,是否
YJ-Ma的小屋🍉
勿在浮沙筑高台