<?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/tags/leveldb/</link><description>Recent content in Leveldb on 111qqz's blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2015-2026 111qqz</copyright><lastBuildDate>Sat, 26 Mar 2022 16:48:54 +0800</lastBuildDate><atom:link href="https://111qqz.com/en/tags/leveldb/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><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><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><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><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><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><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>levelDB 使用笔记</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2018-04-19-leveldb-notes/</link><pubDate>Thu, 19 Apr 2018 15:58:40 +0000</pubDate><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2018-04-19-leveldb-notes/</guid><description>&lt;p&gt;2022-02-26 update:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;说学习笔记听起来像在分析代码。。。但是实际上什么都没干，还是写&amp;quot;使用笔记&amp;quot;好了&lt;/strong&gt;&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><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/leveldb/2017-03-22-murmurhash/</guid><description>&lt;p&gt;分析levelDB源码的时候遇到的&amp;hellip;发现是一个广泛应用的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><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>Lock-free vs wait-free concurrency</title><link>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/%E5%85%B6%E4%BB%96/2017-03-21-lock-free-vs-wait-free-concurrency/</link><pubDate>Tue, 21 Mar 2017 09:24:56 +0000</pubDate><guid>https://111qqz.com/en/post/%E5%B7%A5%E7%A8%8B/%E5%85%B6%E4%BB%96/2017-03-21-lock-free-vs-wait-free-concurrency/</guid><description>&lt;p&gt;&lt;a href="https://rethinkdb.com/blog/lock-free-vs-wait-free-concurrency/" target="_blank" rel="noreferrer"&gt;参考资料&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;看leveldb源码中遇到的，关于lock-free 和 wait-free..感觉这个讲得不错，我试着翻译一下？&lt;/p&gt;</description></item></channel></rss>