- 博客(94)
- 资源 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【leveldb】Log(五)
针对Log文件的作用及格式介绍系列文章中有介绍,可点此处查看Log文件介绍说明。整个Log模块涉及到的文件如下:一、文件结构log_format.h:描述Log格式及Record类型。log_reader.h、log_reader.cc:读模块实现。log_writer.h、log_writer.cc:写模块实现。二、格式信息说明很简单,获取信息如下:一共有四种Record类...
2020-01-18 12:03:48
693
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【操作系统】虚拟内存(一)
寻址1、早期的PC的CPU访问内存方式是使用物理地址,称之为物理寻址。如图12、现代处理器使用的是虚拟寻址的寻址方式,如图2:CPU生成一个虚拟地址,CPU芯片上的内存管理单元MMU,利用存放在主存中的查询表将虚拟地址翻译为物理地址,然后被送到主存中。地址空间虚拟地址空间是一个非负整数地址的有序集合{0,1,2,…},如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间。一...
2019-12-08 17:39:00
428
原创 MySQL事务知识总结
本篇内容还是以脑图的形式进行展示,便于直观看。参考:https://www.cnblogs.com/kismetv/p/10331633.html
2021-01-10 21:25:58
238
原创 MySQL 索引知识大全
本来想以文本的方式来总结记录的,后面直接用脑图记录了,一是看起来更直观,二是可以方便有下载需要的可以直接下载。网页上看不起的可双击放大或者直接下载下来看,后期有调整的会直接修改再上传的。...
2020-12-27 16:47:07
264
原创 MySQL日志分类讲解
前言MySQL的日志在软件的元凶过程中发挥中巨大作用,MySQL的数据恢复、还原、性能监控、问题排查都需要日志来协助。在开始介绍之前,先看下本篇文章的一个大概介绍结构。正文01 重做日志(redo log)02 回滚日志(undo log)03 二进制日志(binlog)错误日志(error log)作用在MySQL数据库中,默认开启错误日志功能。错误日志记录了mysqld在启动、关闭过程中的信息,也包括MySQL在运行过程中的一些错误信息。错误日志中记录的并非全是错误信息,MySQL
2020-10-31 18:09:24
342
1
原创 【leveldb】Recover(二 十 四):数据还原恢复流程
leveldb能保证写入的数据持久化磁盘而不丢失吗?答案是不完全。还未写入到logfile中的数据,如果设备掉电或者leveldb退出,这些数据会丢失。已写入到logfile,如果设备掉电或者leveldb异常退出,这些数据在进行recover时可找回。那leveldb启动时进行Recover,Recover的到底是哪些数据呢?在向leveldb写入一条数据时,大致流程如下:1、一个memtable对应一个logfile。2、在compact memtable后,会进行logfile删除
2020-09-23 22:34:11
1746
2
原创 【leveldb】Compact(二 十 三):Major Compaction
上一篇我们介绍了进行Major Compaction所需要的对象数据实体Compaction。对整个Compact流程的介绍可点此Compact触发流程本片我们来着重介绍下Compact的Major Compaction流程。Major的作用
2020-09-19 17:32:00
848
1
原创 【leveldb】Compact(二 十 二):Major Compaction-Compaction的封装
在正式开始讲解Major Compaction之前我们需要知道Compact的Compaction数据怎么来的。leveldb将要进行Compact的数据封装成了一个class Compaction类,Compaction的数据结构以及怎么来的及做了些什么事,这是本篇要着重介绍的。Compaction调用当调用后台压缩函数DBImpl::BackgroundCompaction()时,根据手动Compact还是自动Compact来产生Compaction。void DBImpl::Backgroun
2020-09-14 23:15:55
635
1
原创 【leveldb】Compact(二 十 一):Minor Compaction
本来想写关于Version源码注解的,想想如果只是简单的Stick下源码也没什么意思,看后面放到Github上再来放链接,这样看可能好些。接下来准备分两篇来介绍下Compact流程。本篇主要是介绍Compact流程和Minor Compaction流程详解。Compact触发流程图有点大,看不清的可点击放大查看。接下来着重讲解下minor Compaction。Minor Compaction简介Minjor Compaction就是将内存中的Memtable持久化到磁盘变成SSTab.
2020-09-06 18:04:37
806
1
原创 【leveldb】Version(二十):图解Version相关结构及流程
对Version注解准备分两篇来说明,Version在leveldb中的重要性值得分两篇文章去记录。第一篇主要对Version的流程好结构进行图解说明,第二篇则是源码注释解读。通过两篇文章的学习可以对Version有个清晰的认识。初探磁盘文件结构Version结构流程...
2020-08-29 12:35:19
1856
1
原创 【leveldb】BloomFilter(十九):理论及实现
有关BloomtFilter的理论知识就不详细介绍了,有兴趣的可以点这里BloomFilter理论推导。本篇主要是记录下BloomFilter一些关键知识点并梳理下leveldb中对BloomFilter的应用。理论影响BlootFilter准确率的参数有:哈希函数的个数 k;布隆过滤器位数组容量 m;布隆过滤器插入的数据量 n为保持准确率得出的结论如下:当哈希函数个数 k=ln(2)*(m/n) 时查询出错的概率最小。当不考虑最优哈希函数k时,假设错误率为 ϵ ,在查询错
2020-07-05 18:44:37
763
1
原创 【leveldb】Cache(十八):BlockCache
针对BlockCache的结构说明已在此篇文章中说明leveldb 内部整体Cache结构说明。BlockCache中缓存的就是实际的KV数据,也就是DataBlock数据。这里为便于理解,可看如下BlockCache结构图: 图1BlockCache:key: 当前table对应的缓存id + BlockData在ldb文件中的偏移位。Value: 就是真实的BlockData数据。注:因为打开的ldb(就是sst)文件中的BlockData都是存放于全局一份的BlockCache中的
2020-07-04 12:43:29
972
1
原创 【leveldb】Cache(十七):TableCache
通过上一篇文章leveldb的Cache整体结构说明, 我们基本上知道了tableCache在整个leveldb中的作用以及上下文类关系,它主要缓存leveldb落地的ldb文件结构在内存中的信息。本篇主要是对代码流程的解读。table_cache.hnamespace leveldb {class Env;class TableCache { public: TableCache(const std::string& dbname, const Options& opti
2020-07-04 12:36:59
639
1
原创 【leveldb】Cache(十六):leveldb 内部整体Cache结构说明
本篇主要讲解下leveldb内部所使用的Cache整体结构及初始化好流程。Cache主要分TableCache和BlockCache。Cache结构1.TableCache 图1TableCache:Key: 落地存储文件名称,例如000021.ldb文件,file_number就是000021。Value: 包括两部分,一是ldb文件句柄,二是ldb文件的table信息,详细的内容已在图1中介绍。注:当前版本是1.22版本,落地的文件好像不是sst格式,而是ldb格式。2.Bloc
2020-07-04 12:31:51
887
1
原创 MySql 批量插入时间递增的测试数据
对于需要测试MySql大表性能的,经常需要插入数据,涉及到datetime的字段希望能间隔多久进行递增。基于以上情况,MySql存储过程可轻松搞定,下文仅以记录方便查询。DELIMITER //CREATE PROCEDURE test1(X INT(10),Y INT(10))BEGINDECLARE i INT DEFAULT X;DECLARE DTime DATETIME DEFAULT '2020-06-28 17:29:00';WHILE i< Y DOINSERT INT
2020-07-01 19:22:12
1407
原创 【leveldb】TwoLevelIterator(十五)
在分析SSTable代码过程中涉及到了二级迭代器,此篇借此展开分析下。二级迭代器的存在便于对SSTable的DataBlock数据进行访问,其结构如下: 图1对于SSTable来说:Level_1是Index Block迭代器;Level_2是指向DataBlock迭代器。源码解读namespace leveldb {namespace {//设置二级迭代器时传入的回调函数typedef Iterator* (*BlockFunction)(void*, const ReadOp
2020-06-14 17:54:30
545
原创 【leveldb】SSTable(十四):SSTable 读写流程
SSTable就是leveldb最后落地存储的文件,针对SSTable详细格式介绍可点此SSTable存储结构说明。本篇主要是对SSTable的读写流程代码研读。写流程写流程就是按照SSTable的格式去写,阅读起来并不是太复杂。namespace leveldb {struct TableBuilder::Rep { Rep(const Options& opt, WritableFile* f) : options(opt), index_block_o
2020-06-14 17:48:57
810
原创 【leveldb】SSTable(十三):Filter Block
上一篇主要介绍了DataBlock,本篇则开始讲解Filter Block,其在SSTable中的结构可点此链接SSTable结构说明。Filter Block中存的都是Data Block中的key(key是经过处理再存入到FilterBlock中),其作用就是提高SSTable的读取效率。当查询一个key时,可以快速定位这个key是否在当前SSTable中,其流程是当进行一个key查询时,先通过index block中的二分法确定key在哪个Data Block中,取出这个Data Block的off
2020-06-07 18:08:42
965
原创 【leveldb】SSTable(十二):Data Block
DataBlock属于SSTable中Block的一种,关于DataBlock与SSTable的关系,可点此链接查看SSTable结构说明。本篇主要是对DataBlock的读写流程解读。这里为便于理解,则将DataBlock格式再次放出: 图1写流程写流程很简单,就是按照DataBlock格式去封装。block_builder.hnamespace leveldb {struct Options;class BlockBuilder { public: explicit Bloc
2020-06-07 17:04:39
699
原创 【leveldb】SSTable(十一):存储结构说明
针对SSTable的结构说明,这篇博客已有介绍,可点此链接查看,leveldb整体架构。本篇是针对SStable结构的进一步扩展介绍说明。系列文章的分析都是基于leveldb 1.22版本分析的。SSTable文件结构落地的SSTable文件结构如下图1图1其中Data block、Meta block、Metablock index、index block都属于Block,Footer是单独的数据格式。1.Block结构图22.Footer结构Footer结构共占用48Byte,组
2020-05-31 18:41:27
1163
原创 通过IOU来简单判断两个坐标是否是指向同一个目标
业务场景一张抓拍图片中有多个个目标,一个主目标,多个关联目标。前端智能设备在检测目标时,由于设备软件设计或者检测算法局限性,同一张抓拍图片中的多个目标不会关联性的通知给后端服务。这样后端业务如果想实现主目标对应哪些关联目标的话,就不好实现。为此需要在后端通过智能检测算法,再次对抓拍图片中的目标进行检测并记录检测目标和关联目标的坐标位置。约束由于前后端检测算法不一样,会导致对抓拍图片中主...
2020-05-01 12:50:59
1243
原创 算法复杂度分析看这一篇就够了
执行效率是算法一个非常重要的考量指标,而时间复杂度和空间复杂度则是衡量算法代码的执行效率。为什么需要复杂度分析通常情况下,我们可以在写完代码的情况下把程序跑一遍,通过统计、监控,就能得出算法执行的时间和空间内存大小。但这些统计有很大的局限性。测试结果非常依赖测试环境,不同的硬件对测试结果影响很大。测试结果受数据规模影响很大。所以我们需要一个不用具体的测试数据来测试,就可以粗略地估计算...
2020-04-18 12:05:56
3509
1
原创 【MySQL】 简述MySQL基础架构(一)
本篇从MySQL架构入手进行记录说明。一、体系结构这里我们从逻辑上把它划分为四层:用户请求层(客户端);Server层;存储引擎层;文件系统层。图1二、模块作用1.连接器管理客户端的连接,权限验证。2.查询缓存建立连接之后发去查询,如果缓存里有则直接返回,否则进行下一步。3.分析器和编译器中的分析器同理,包括词法分析、语法分析。词法分析就是查询语...
2020-04-12 23:38:59
298
原创 【leveldb】Memtable-实现(十)
通过对Memtable所使用到的Key的详细介绍Key介绍,接下来对Memtable的实现讲解则轻松的多。一、结构Memtable以一个个Entry为单元进行存储,Entry结构图如下:图1Klength = UserKey.length + 8 (sequenceNumber + ValueType);Vlength = Value.length。二、关联类Internal...
2020-03-28 21:43:50
737
原创 【leveldb】Memtable-基础知识(九)
在阅读Memtable代码的过程中涉及到leveldb的各种key,只有对这些key理解清楚了,读起Memtable才会很轻松,所以这篇着重讲解下这些key。一、Key看图1,先有个初步印象: 图11.SequenceNumber+Typeleveldb每次更新(put/delete)操作都拥有一个版本,由SequenceNumber来标识,整个leveldb有一个全局值保存着当前使用...
2020-03-22 23:58:06
746
原创 【leveldb】变长编码Varint(八)
在阅读Memtable处理流程时看到了Varint32、Varint64,一开始不是太理解,导致阅读Memtable出现一定障碍,所以这里就单独列出来讲下,下文用Varint特指Varint32。一、什么是变长编码【定义】Varint是一种通过一个或多个字节来表示整数的方法。即之前用固定字节数来表示一个正数,Varint通过可变的字节数来表示一个整数。【范围】对于32位(Varint32...
2020-03-17 23:37:11
1619
原创 【leveldb】SkipList(七)
SkipList(跳表)数据结构是用于Memtable,Immutable Memtable表中,对于此二表的作用点此查看Memtable作用。Memtable是内存中的表,用于存储插入的KV数据。SkipList的作用就是解决KV的快速插入和查询。一、介绍SkipList使用空间换时间的设计思路,通过构建多级索引来提高查询的效率,实现了基于链表的“二分查找”。跳表是一种动态数据结构,支持快...
2020-03-07 18:53:28
513
原创 大小端疑惑汇总
猿猿们工作中是会经常遇到内存字节序问题,字节序一般又分为:大端模式;小端模式。网络字节序默认是大端模式。一、定义大端模式:高位字节存放在低地址处,低位字节存放在高地址处。小端模式:高位字节存放在高地址处,地位字节存放在低地址处。举例:一个十六进制数 0x12345678,系统以一个字节为存储单位。大端模式Addressaa + 1a + 2a + 3...
2020-02-22 11:38:45
571
2
原创 【leveldb】Arena(六)
我们知道频繁的向系统申请内存是很容易造成内存碎片的,如果申请内存很小则更严重。leveldb针对这种小内存的临时频繁申请使用了Arena来解决。Arena只是粗粒度的内存管理,只用在了MemTable和skiplist中,是作为一个局部临时对象来使用并未用在全局,Arena的内部实现是存在内存浪费的。一、结构二、源码arena.hnamespace leveldb {class A...
2020-02-16 18:42:12
381
原创 【leveldb】Slice(四)
leveldb内部没有使用string,而是使用了一个Slice数据结构来指向一块数据,每次给参数都给Slice而不用给数据的拷贝,这样就省去内存的拷贝。leveldb所涉及到KV操作的接口都是用的Slice。注意事项:如果是多线程调用同一个Slice的const方法,则不用关注多线程同步问题,如果是非const方法则由调用则保证多线程之间的同步;使用Slice之前,必须保证Slice指向...
2019-12-22 22:31:40
476
原创 【leveldb】Options、ReadOptions、WriteOptions(三)
Options:主要用于控制DB的一些操作。ReadOptions:用于控制读操作属性。WriteOptions:用于控制写操作属性。一、Options// Options to control the behavior of a database (passed to DB::Open) <!用于控制DB的一些特性>struct LEVELDB_EXPORT Opti...
2019-12-22 18:40:02
1733
转载 【leveldb】整体架构(二)
注:本文转自http://cighao.com/2016/08/14/leveldb-source-analysis-02-structure/感觉被转作者已经写的很清晰,文中所描述的一些信息当前最新版本可能已经支持,一些关键点也有待后续的阅读确认。一、整体结构LevelDB 作为存储系统,数据记录的存储介质包括内存以及磁盘文件,当 LevelDB 运行了一段时间,此时我们给 LevelDB...
2019-12-15 23:27:46
1107
1
原创 【leveldb】编译与安装(一)
对leveldb的介绍这里就不说了,最近准备对leveldb学习了解下,学习之前先编译安装能运行。【环境】编译开发工具vs2015。一开始用的是VS2013,但是vs2013对C++11支持不是太好,会导致leveldb编译问题,所以直接换成了vs2015。boost版本是boost_1-55-0。网上说leveldb对boost有依赖,所以就安装了,具体哪些部分依赖还有待确认。cmak...
2019-11-10 20:36:02
1060
原创 【STL】deque(七)
vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。如图1图1deque与vector的差异:deque允许于参数时间内对起头端进行元素的插入或移除操作。deque没有所谓容量(capacity)概念,因为deque是动态地以分段连续空间组合而成。deque也提供了Ramdon Access Iterator,但它的迭代器并不是普通的指针,比vector复...
2019-11-03 12:34:21
352
1
原创 【STL】list(六)
相对于vector的连续线性空间,list是非线性非连续空间,虽然会复杂一些,但是每次插入或者删除一个元素,只是配置或释放一个元素空间,而且对任何位置的元素插入或移除,list都是常数操作时间。【节点结构】list本身和list的结点是不同结构,需分开设计。结点结构:template <class T>struct __list_node{ typedef void* ...
2019-10-20 19:44:52
192
原创 win环境下修改夏令时之后无法正确获取系统时间
【现象】在windows环境下开启关闭夏令时之后,调用第三方库获取系统时间会不正确。【解决】在windowns环境下可使用Windows API:#include < windows.h> #include < stdio.h> int main( void ) { SYSTEMTIME sys; GetLocalTim...
2019-10-11 19:12:18
363
原创 【STL】vector(五)
一、概述vector的数据安排及操作方式与array很相似,二者唯一差别在于空间运用的灵活性。array是静态空间,一旦配置了大小,就不能改变,要换个大或者小点的空间,得有客户端自己来操作。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。vector相对于array来说就是可以自己内部进行内存的动态缩减,vector这种操作有有点也有缺点。【优点】v...
2019-10-07 16:50:09
262
原创 【STL】迭代器与Traits编程技法(四)
一、概念迭代器(iterators)是一种抽象的概念,设计模式中的迭代器模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起。而迭代器就是这个胶着剂。为了不暴露容器内部的表达方式,将迭代器的开发工作交给每个容器的设计者,如此一来,所有的实现...
2019-09-14 13:06:41
335
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人