/
redis-is-not-only-single-threaded.html
143 lines (117 loc) · 8.42 KB
/
redis-is-not-only-single-threaded.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Redis is not only single threaded</title>
<meta name="description" content="常聽到或是看到人說 Redis 是 single threaded,但始終沒有看到有人貼出程式碼證明這件事情。">
<meta property="og:image" content="https://i.imgur.com/hD6x1s9.jpg">
<meta property="og:site_name" content="Lee Xun's blog">
<meta property="og:type" content="website">
<meta property="og:title" content="Redis is not only single threaded">
<!-- <meta property="og:url" content="https://blog.leexun.tw/redis-is-not-only-single-threaded"> -->
<meta property="og:description" content="常聽到或是看到人說 Redis 是 single threaded,但始終沒有看到有人貼出程式碼證明這件事情。">
<meta name="twitter:card" content="summary">
<meta name="twitter:creator" content="@leexun">
<meta name="twitter:site" content="Lee Xun's blog">
<meta name="twitter:title" content="Redis is not only single threaded">
<meta name="twitter:image" content="https://i.imgur.com/hD6x1s9.jpg">
<link rel="stylesheet" href="/css/main.css">
<meta name="twitter:description" content="常聽到或是看到人說 Redis 是 single threaded,但始終沒有看到有人貼出程式碼證明這件事情。">
<link rel="canonical" href="https://blog.leexun.tw/redis-is-not-only-single-threaded">
<link rel="alternate" type="application/rss+xml" title="Lee Xun's blog" href="https://blog.leexun.tw/feed.xml" />
<link rel="shortcut icon" href="/favicon.ico?v=2">
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-85060382-1', 'auto');
ga('send', 'pageview');
</script>
</head>
<body>
<header class="site-header">
<div class="container">
<!-- <input type="checkbox" id="toggleNavbar"> -->
<h1 class="logo"><a href="/">Lee<span>Xun</span> <small>e88081e5a986e58fafe6849b0a ♥</small></a></h1>
<!-- <label for="toggleNavbar" role="button" class="toggle-navbar-button">
<i class="icon icon-menu"></i>
<i class="icon icon-cross"></i>
</label> -->
<nav class="navbar">
<ul>
<li><a href="/about" title="About">About</a></li>
<li><a href="/" title="Home">Home</a></li>
<li><a href="/feed.xml" target="_blank"><i class="icon icon-rss"></i></a></li>
</ul>
</nav>
</div>
</header>
<main class="main-container">
<div class="container">
<article role="article" class="page card">
<header class="post-header">
<h1 class="post-title">Redis is not only single threaded</h1>
<em class="post-meta">
<time>Mar 21, 2019</time>
</em>
</header>
<div class="post-content">
<p>常聽到或是看到人說 Redis 是 single threaded,但始終沒有看到有人貼出程式碼證明這件事情。</p>
<p>事實上這是錯的,我們到 Github 直接搜尋 <code>pthread_create</code>,就可以發現其實在 <code>redis/src/bio.c</code> 裡面是有開 thread 來做 Background I/O 的,而且 redis 使用的 malloc lib 也就是 jemalloc,裡面也是會開 multithread 的。</p>
<p><a href="https://github.com/antirez/redis/blob/3d07ed983e8bc55e7d066558de0244bc77dbeba3/src/bio.c#L118-L128">請見原始碼</a></p>
<figure class="highlight"><pre><code class="language-c" data-lang="c"><span></span><span class="cm">/* bio.c#L118-L128 */</span>
<span class="cm">/* Ready to spawn our threads. We use the single argument the thread</span>
<span class="cm">* function accepts in order to pass the job ID the thread is</span>
<span class="cm">* responsible of. */</span>
<span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o"><</span> <span class="n">BIO_NUM_OPS</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kt">void</span> <span class="o">*</span><span class="n">arg</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)(</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="p">)</span> <span class="n">j</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">pthread_create</span><span class="p">(</span><span class="o">&</span><span class="kr">thread</span><span class="p">,</span><span class="o">&</span><span class="n">attr</span><span class="p">,</span><span class="n">bioProcessBackgroundJobs</span><span class="p">,</span><span class="n">arg</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">serverLog</span><span class="p">(</span><span class="n">LL_WARNING</span><span class="p">,</span><span class="s">"Fatal: Can't initialize Background Jobs."</span><span class="p">);</span>
<span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">bio_threads</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="kr">thread</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>
<p>會說 redis 是 single threaded,純粹只是因為 main worker thread 只有一條,這和說 Node.js 是 single threaded 是相同的誤會。</p>
<p>之後來補一下為何要用 single main thread 實作,和他的優缺點。</p>
</div>
<hr>
<aside id="comments" class="disqus">
<h3><i class="icon icon-comments-o"></i> Comments</h3>
<div id="disqus_thread"></div>
<script>
var disqus_config = function() {
this.page.url = 'https://blog.leexun.tw/redis-is-not-only-single-threaded';
this.page.identifier = '/redis-is-not-only-single-threaded';
};
(function() {
var d = document,
s = d.createElement('script');
s.src = '//blogleexuntw.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
</aside>
</article>
</div>
</main>
<footer class="site-footer">
<div class="container">
<ul class="social">
<li><a href="https://github.com/leexun" target="_blank"><i class="icon icon-github"></i></a></li>
<li><a href="https://twitter.com/speachlesslee" target="_blank"><i class="icon icon-twitter"></i></a></li>
<li><a href="https://facebook.com/" target="_blank"><i class="icon icon-facebook"></i></a></li>
<li><a href="https://www.linkedin.com/in/leexunofficial/" target="_blank"><i class="icon icon-linkedin"></i></a></li>
</ul>
<p class="txt-medium-gray">
<small>©2019 All rights reserved @leexun.
</p>
</div>
</footer>
<a href="http://github.com/LeeXun/leexun.github.io" target="_blank" class="github-corner"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#337ab7; color:#fff; position: absolute; top: 0; border: 0; right: 0;"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
</body>
</html>