Home

leveldb笔记之15:minor compaction 之 version

这篇笔记讲下minor compaction过程中version是怎么生效的,算是对 minor compaction 介绍的补充。 imm_持久化为 sstable 文件后,文件的相关信息通过meta返回 { mutex_.Unlock(); //更新memtable中全部数据到xxx.ldb文件 //meta记录key range, file_size等sst信息 s = BuildTable(dbname_, env_, options_, table_cache_, iter, &meta); mutex_.Lock(); } struct FileMetaData { int refs; int allo...

Read more

leveldb笔记之14:version

上一篇笔记开始讲 minor compaction,对于 memtable 转化为 sstable 这个过程,在之前的笔记里都做了很多的铺垫,例如 MemTable/SSTable 的数据结构,写入/读取的整个流程等,因此理解起来应该不算复杂。不过其中涉及版本的操作,例如versions_->LogAndApply(&edit, &mutex_);,如果没有抓住 leveldb 里 version 相关的关键结构,很容易被绕晕。 这篇笔记,开始讲下 version. 1. 为什么要有版本管理 compaction 简言之,是一个新增与删除文件的过程。例如对于上一篇介绍的 minor compaction,是新增一个文件。对于 major compaction...

Read more

leveldb笔记之13:minor compaction

在level笔记开篇里,提到过Compaction这个过程,这是 leveldb 中最为复杂的一部分,从这篇笔记开始,介绍下 Compaction. compaction 分为两种:minor compaction 和 major compaction. minor compaction 相对简单一些,对应了MemTable持久化为sstable的过程。 1. 简介 DBImpl定义了两个MemTable: MemTable* mem_; MemTable* imm_ GUARDED_BY(mutex_); // Memtable being compacted 当size of mem_ <= options_.write_buffer_size时,数据都...

Read more

summary of <105 STL Algorithms in Less Than an Hour>

your browser does not support the video tag 1. WHY? STL algorithms can make code more expressive Avoid common mistakes Used by lots of people 2. THE WORLD OF C++ STL ALGORITHMS 2.1. LANDS of PERMUTATIONS 2.1.1. PROVINCE OF HEAPS make_heap push_heap pop_heap 2.1.2. SHORE OF SORTING sort partial_sort nth_element /...

Read more

如何同步网站文章到百家号

2019-02-25 udpate: 连着每天试了几次,每天都是不同的文章,一直返回成功,但是平台上就是看不到,建议还是手动发布图文,感兴趣的可以看下各个坑。 之前通过搜索资源平台提交数据到手百,还是很方便的。最近眼看着手百客户端逐渐下掉了熊掌号之前推送的文章,只留下了个人博客唯一一个入口。因此研究了下如何把网站文章自动同步到百家号。 具体可以参考开发者文档,提供了一个将富文本推送到百家号平台的机制。 文档本身还是很简单的,甚至有些简陋,可以参考这个例子. 这里主要介绍下几次留言咨询了解到的坑: content 必须是富文本格式 cover_imags 必须经过 json_encode,例如 python 代码:json.dumps(cover_images)...

Read more

protobuf之extension

最近看到的代码里, extension 字段使用越来越广泛,因此这篇笔记介绍下 extension 的使用。同时,protobuf反射详解里的 field 接口获取不到 extension 字段,因此也会介绍下关于 extension 的反射。 1. 使用 extension 用于解决字段扩展的场景,例如我们提供一个基础的 message,各个第三方都可以基于该 message 扩展新的字段,例如: // base.proto package base; message Link { optional string url = 1; extensions 1000 to 1050; } // third-party-1.proto package thirdparty1...

Read more

leveldb笔记之12:LRUCache的使用

上篇讲了 leveldb 里 LRUCache 的实现,这篇笔记继续介绍下具体的使用场景。 我最开始的理解,是 leveldb 缓存了用户写入/读取的原始 key:value 数据,实际上是错误的。leveldb 缓存了两种类型的数据:Block及Table. 接下来分别介绍下. 1. Block 通过内存缓存高频访问的 data block,避免从磁盘读取,从而提高数据的访问速率。 1.1. 初始化 在SanitizeOptions函数里初始化 if (result.block_cache == nullptr) { // 默认缓存大小为8M result.block_cache = NewLRUCache(8 << 20); } ...

Read more

leveldb笔记之11:LRUCache的实现

之前介绍multi_index_container时,使用了 LRU Cache 作为一个简单测试的例子。本文介绍下 LRU Cache 的原理以及 leveldb 里的实现。 1. 原理 Cache 用于提供对数据更高速的访问,因此存储上也更昂贵,例如 mem ssd 等,其容量通常都是有限的,因此就需要一定的缓存淘汰策略。LRU(Least recently used)就是其中一种,一句话介绍的话,就是: 淘汰最不常用的数据 wiki上有一个比较直观的例子: 读取的顺序为 A B C D E D F,缓存大小为4,括号内的数字表示排序,数字越小,表示 Least recently. 按照箭头的方向, 读取 E 时,缓存已满,因此淘汰最开始的 A. 读取 D 时,更新...

Read more