leveldb笔记之16:seek_compaction && size_compaction
major compaction 一个首要问题,就是要 compact 哪个文件。这个计算是在version完成的,与之相关的主要是两个属性allowed_seeks compaction_score。
1. seek_compaction
一个直观的想法是如果文件多次 seek 但是没有查找到数据,那么就应该被 compact 了,否则会浪费更多的 seek。用一次 compact 来解决长久空 seek 的问题,本质上,还是如何平衡读写的思想。
具体的,当一个新文件更新进入版本管理,计算该文件允许 seek 但是没有查到数据的最大次数,当超过该次数后,就应该 compact 该文件了。
对应到代码实现,是在VersionSet::Builder::Apply阶段:https...
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...
leveldb笔记之14:version
上一篇笔记开始讲 minor compaction,对于 memtable 转化为 sstable 这个过程,在之前的笔记里都做了很多的铺垫,例如 MemTable/SSTable 的数据结构,写入/读取的整个流程等,因此理解起来应该不算复杂。不过其中涉及版本的操作,例如versions_->LogAndApply(&edit, &mutex_);,如果没有抓住 leveldb 里 version 相关的关键结构,很容易被绕晕。
这篇笔记,开始讲下 version.
1. 为什么要有版本管理
compaction 简言之,是一个新增与删除文件的过程。例如对于上一篇介绍的 minor compaction,是新增一个文件。对于 major compaction...
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);
}
...
235 post articles, 30 pages.