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时,数据都...
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
/...
如何同步网站文章到百家号
2019-02-25 udpate:
连着每天试了几次,每天都是不同的文章,一直返回成功,但是平台上就是看不到,建议还是手动发布图文,感兴趣的可以看下各个坑。
之前通过搜索资源平台提交数据到手百,还是很方便的。最近眼看着手百客户端逐渐下掉了熊掌号之前推送的文章,只留下了个人博客唯一一个入口。因此研究了下如何把网站文章自动同步到百家号。
具体可以参考开发者文档,提供了一个将富文本推送到百家号平台的机制。
文档本身还是很简单的,甚至有些简陋,可以参考这个例子.
这里主要介绍下几次留言咨询了解到的坑:
content 必须是富文本格式
cover_imags 必须经过 json_encode,例如 python 代码:json.dumps(cover_images)...
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...
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);
}
...
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 时,更新...
leveldb笔记之10:sstable读取
1. 简介
前面介绍了 sstable,包括 sstable 的结构组成及写入的源码分析,本文主要介绍下对应的读取过程,能够帮助读者更深入的理解一个 sstable 的数据格式。
2. 基本过程
sstable 的读取过程,简单总结就是四个字:按图索骥。
各个索引在这个过程发挥了很大的作用。
首先是 seek 到文件末尾读取固定48个字节大小的 footer,这也是为什么footer是定长的原因.
然后解析出 meta_index_block 以及 index_block。
通过 meta_index_block 解析出 filter block,通过 index_block 解析出 data_block.
查找时,先通过 filter block 查找是否存在,然后通...
232 post articles, 29 pages.