Redis 面試寶典之 Redis 屬于單線程還是多線程?不同的版本有什么區(qū)別?

Redis 是普及率最高的技術(shù)之一,同時(shí)也是面試中必問(wèn)的一個(gè)技術(shù)模塊,所以從今天開(kāi)始我們將從最熱門的 Redis 面試題入手,更加深入的學(xué)習(xí)和了解一下 Redis。

我們本文的面試題是 Redis 屬于單線程還是多線程?

典型回答

本文的問(wèn)題在不同的 Redis 版本下答案是不同的,在 Redis 4.0 之前,Redis 是單線程運(yùn)行的,但單線程并不意味著性能低,類似單線程的程序還有 Nginx 和 NodeJs 他們都是單線程程序,但是效率并不低。 Redis 的 FAQ(Frequently Asked Questions,常見(jiàn)問(wèn)題)也回到過(guò)這個(gè)問(wèn)題,具體內(nèi)容如下:

Redis is single threaded. How can I exploit multiple CPU / cores?

It's not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound. For instance, using pipelining Redis running on an average Linux system can deliver even 1 million requests per second, so if your application mainly uses O(N) or O(log(N)) commands, it is hardly going to use too much CPU.

However, to maximize CPU usage you can start multiple instances of Redis in the same box and treat them as different servers. At some point a single box may not be enough anyway, so if you want to use multiple CPUs you can start thinking of some way to shard earlier.

You can find more information about using multiple Redis instances in the Partitioning page.

However with Redis 4.0 we started to make Redis more threaded. For now this is limited to deleting objects in the background, and to blocking commands implemented via Redis modules. For future releases, the plan is to make Redis more and more threaded.

詳情請(qǐng)見(jiàn):https://redis.io/topics/faq

他的大體意思是說(shuō) Redis 是基于內(nèi)存操作的,因此他的瓶頸可能是機(jī)器的內(nèi)存或者網(wǎng)絡(luò)帶寬而并非 CPU,既然 CPU 不是瓶頸,那么自然就采用單線程的解決方案了,況且使用多線程比較麻煩。但是在 Redis 4.0 中開(kāi)始支持多線程了,例如后臺(tái)刪除等功能。

簡(jiǎn)單來(lái)說(shuō) Redis 之所以在 4.0 之前一直采用單線程的模式是因?yàn)橐韵氯齻€(gè)原因:

  • 使用單線程模型是 Redis 的開(kāi)發(fā)和維護(hù)更簡(jiǎn)單,因?yàn)閱尉€程模型方便開(kāi)發(fā)和調(diào)試;
  • 即使使用單線程模型也并發(fā)的處理多客戶端的請(qǐng)求,主要使用的是多路復(fù)用(詳見(jiàn)本文下半部分);
  • 對(duì)于 Redis 系統(tǒng)來(lái)說(shuō),主要的性能瓶頸是內(nèi)存或者網(wǎng)絡(luò)帶寬而并非 CPU。

Redis 在 4.0 中引入了惰性刪除(也可以叫異步刪除),意思就是說(shuō)我們可以使用異步的方式對(duì) Redis 中的數(shù)據(jù)進(jìn)行刪除操作了,例如 unlink key / flushdb async / flushall async 等命令,他們的執(zhí)行示例如下:

> unlink key # 后臺(tái)刪除某個(gè) key
> OK # 執(zhí)行成功
> flushall async # 清空所有數(shù)據(jù)
> OK # 執(zhí)行成功

這樣處理的好處是不會(huì)導(dǎo)致 Redis 主線程卡頓,會(huì)把這些刪除操作交給后臺(tái)線程來(lái)執(zhí)行。

小貼士:通常情況下使用 del 指令可以很快的刪除數(shù)據(jù),而當(dāng)被刪除的 key 是一個(gè)非常大的對(duì)象時(shí),例如時(shí)包含了成千上萬(wàn)個(gè)元素的 hash 集合時(shí),那么 del 指令就會(huì)造成 Redis 主線程卡頓,因此使用惰性刪除可以有效的避免 Redis 卡頓的問(wèn)題。

考點(diǎn)分析

關(guān)于 Redis 線程模型的問(wèn)題(單線程或多線程)幾乎是 Redis 必問(wèn)的問(wèn)題之一,但能回答好的人卻寥寥無(wú)幾,大部分的人只能回到上來(lái) Redis 是單線程的以及說(shuō)出來(lái)單線程的眾多好處,但對(duì)于 Redis 4.0 和 Redis 6.0 中,尤其是 Redis 6.0 中的多線程能回答上來(lái)的人少之又少,和這個(gè)知識(shí)點(diǎn)相關(guān)的面試題還有以下這些。

  • Redis 主線程既然是單線程的,為什么還這么快?
  • 介紹一下 Redis 中的多路復(fù)用?
  • 介紹一下 Redis 6.0 中的多線程?
還有 57% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
支付 ¥3.99 繼續(xù)閱讀

友情鏈接更多精彩內(nèi)容