<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LevelDB代码阅读笔记 on 111qqz's blog</title><link>https://111qqz.com/en/series/leveldb%E4%BB%A3%E7%A0%81%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/</link><description>Recent content in LevelDB代码阅读笔记 on 111qqz's blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>hust.111qqz@gmail.com (111qqz)</managingEditor><webMaster>hust.111qqz@gmail.com (111qqz)</webMaster><copyright>© 2011-2026 111qqz</copyright><lastBuildDate>Sat, 26 Mar 2022 16:48:54 +0800</lastBuildDate><atom:link href="https://111qqz.com/en/series/leveldb%E4%BB%A3%E7%A0%81%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>[施工中] levelDB 代码阅读笔记 06 iterator</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-26-reading-leveldb-code-06/</link><pubDate>Sat, 26 Mar 2022 16:48:54 +0800</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-26-reading-leveldb-code-06/</guid><description>&lt;h2 class="relative group"&gt;接口
 &lt;div id="接口" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%8e%a5%e5%8f%a3" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;一个ABC，后面会继承这个类做各种实现&lt;/p&gt;</description></item><item><title>levelDB 代码阅读笔记 05 arena</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-20-reading-leveldb-code-05/</link><pubDate>Sun, 20 Mar 2022 17:23:18 +0800</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-20-reading-leveldb-code-05/</guid><description>&lt;p&gt;arena是levelDB中的内存池实现&lt;/p&gt;

&lt;h2 class="relative group"&gt;接口
 &lt;div id="接口" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%8e%a5%e5%8f%a3" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;没有太多好说的，都非常直观。补了些注释&lt;/p&gt;</description></item><item><title>levelDB 代码阅读笔记 04 filter</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-12-reading-leveldb-code-04/</link><pubDate>Sun, 13 Mar 2022 07:55:17 +0800</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-12-reading-leveldb-code-04/</guid><description>&lt;h2 class="relative group"&gt;FilterPolicy接口
 &lt;div id="filterpolicy接口" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#filterpolicy%e6%8e%a5%e5%8f%a3" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LEVELDB_EXPORT&lt;/span&gt; &lt;span class="n"&gt;FilterPolicy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;FilterPolicy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Return the name of this policy. Note that if the filter encoding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// changes in an incompatible way, the name returned by this method
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// must be changed. Otherwise, old incompatible filters may be
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// passed to methods of this type.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// keys[0,n-1] contains a list of keys (potentially with duplicates)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// that are ordered according to the user supplied comparator.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Append a filter that summarizes keys[0,n-1] to *dst.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Warning: do not change the initial contents of *dst. Instead,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// append the newly constructed filter to *dst.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CreateFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// &amp;#34;filter&amp;#34; contains the data appended by a preceding call to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// CreateFilter() on this class. This method must return true if
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// the key was in the list of keys passed to CreateFilter().
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// This method may return true or false if the key was not on the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// list, but it should aim to return false with a high probability.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;KeyMayMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;27&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;其中CreateFilter的含义是从n个key生成一个 std::string. 生成的std::string可以包含n个key的信息(类似于生成了一个全集) 从而后续判断某个key是否在其中。&lt;/p&gt;</description></item><item><title>LevelDB 源码阅读 03：Cache 与 LRU</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-06-reading-leveldb-code-03/</link><pubDate>Sun, 06 Mar 2022 17:20:59 +0800</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-06-reading-leveldb-code-03/</guid><description>从 Cache 接口进入 LevelDB 的 LRUCache、Handle 生命周期与分片并发设计。</description></item><item><title>levelDB 代码阅读笔记 02 comparator</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-01-reading-leveldb-code-02/</link><pubDate>Tue, 01 Mar 2022 20:01:50 +0800</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-03-01-reading-leveldb-code-02/</guid><description>&lt;p&gt;levelDB是一个有序的KV存储，因此key的顺序是十分关键的
levelDB提供用户自己定义key顺序的能力&lt;/p&gt;</description></item><item><title>levelDB 代码阅读笔记 01 db.h</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-02-26-reading-leveldb-code-01/</link><pubDate>Sat, 26 Feb 2022 19:10:30 +0800</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2022-02-26-reading-leveldb-code-01/</guid><description>&lt;h2 class="relative group"&gt;背景
 &lt;div id="背景" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%83%8c%e6%99%af" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;最近在做一个智能算力相关的项目，类似&lt;a href="https://tech.meituan.com/2021/06/17/waimai-ai-advertisement.html" target="_blank" rel="noreferrer"&gt;美团外卖广告智能算力的探索与实践&lt;/a&gt;
其中实现控制系统需要与数据库交互。虽然最后技术选型并没有使用到levelDB，但是想趁机把代码读了吧。&lt;/p&gt;</description></item><item><title>murmurhash源码分析</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2017-03-22-murmurhash/</link><pubDate>Wed, 22 Mar 2017 12:20:37 +0000</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2017-03-22-murmurhash/</guid><description>&lt;p&gt;分析 levelDB 源码的时候遇到的，发现是一个广泛应用的 hash 算法，而且是纯 C 写的，于是找来了源码看。&lt;/p&gt;</description></item><item><title>内存屏障（Memory Barriers）</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2017-03-17-memory-barriers/</link><pubDate>Wed, 22 Mar 2017 05:16:53 +0000</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2017-03-17-memory-barriers/</guid><description>&lt;p&gt;起因是最近在看 levelDB 源码，其中 port 里的&lt;strong&gt;atomic_pointer.h 文件用到了内存屏障。。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>文本相似度判断-simhash算法学习笔记</title><link>https://111qqz.com/en/post/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/2017-03-10-simhash-notes/</link><pubDate>Fri, 10 Mar 2017 03:33:08 +0000</pubDate><author>hust.111qqz@gmail.com (111qqz)</author><guid>https://111qqz.com/en/post/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/2017-03-10-simhash-notes/</guid><description>&lt;p&gt;先放原始论文。。以此表达对这个算法的敬意 orz&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.australianscience.com.au/research/google/33026.pdf" target="_blank" rel="noreferrer"&gt;论文链接&lt;/a&gt;&lt;/p&gt;

&lt;h2 class="relative group"&gt;问题引出：
 &lt;div id="问题引出" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%97%ae%e9%a2%98%e5%bc%95%e5%87%ba" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;那天百度一面，frog 学姐问了我如何判断两篇新闻稿相似度的问题&amp;hellip;.我满篇口胡，也只是回答了一些诸如从图片上考虑、或者去掉 stop word 之后得到特征向量再计算余弦值之类的传统想法。&lt;/p&gt;</description></item></channel></rss>