Redis(全稱(chēng):Remote Dictionary Server) 是一個(gè)使用ANSI C編寫(xiě)的開(kāi)源的支持網(wǎng)絡(luò)、內(nèi)存和磁盤(pán)三種持久化方式的Key-Value數(shù)據(jù)庫(kù)。
Redis的存儲(chǔ)方式是將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,提供了非常快速的讀寫(xiě)操作,因此被廣泛應(yīng)用于高并發(fā)的web系統(tǒng)和內(nèi)存數(shù)據(jù)緩存方案中。
為什么Redis使用單線(xiàn)程?
Redis單線(xiàn)程之所以被廣泛認(rèn)可,主要有以下幾個(gè)原因:
避免線(xiàn)程切換帶來(lái)的開(kāi)銷(xiāo):線(xiàn)程切換會(huì)帶來(lái)一些額外的開(kāi)銷(xiāo),如時(shí)間開(kāi)銷(xiāo)和內(nèi)存開(kāi)銷(xiāo)。在高并發(fā)的場(chǎng)景下,線(xiàn)程切換會(huì)讓系統(tǒng)的資源消耗更多,如果Redis采用多線(xiàn)程模式,線(xiàn)程切換的開(kāi)銷(xiāo)將變得更加顯著。
利用單線(xiàn)程性能優(yōu)化:由于Redis采用的是單線(xiàn)程模型,其執(zhí)行代碼是串行的,自然不存在所謂的鎖競(jìng)爭(zhēng)問(wèn)題。因此在Redis使用單核處理器的情況下,每個(gè)客戶(hù)端的請(qǐng)求都是被逐一處理的,能夠更好的利用CPU性能。
AOF和RDB持久化機(jī)制下單線(xiàn)程更可控:Redis提供了AOF和RDB兩種持久化機(jī)制。在A(yíng)OF方式下,每次寫(xiě)操作會(huì)被記錄到一個(gè)appendonly.aof日志中,這個(gè)文件是以串行的方式寫(xiě)入的,因此單線(xiàn)程可以更好的控制日志文件的寫(xiě)操作。在RDB方式下,Redis會(huì)在指定的時(shí)間間隔內(nèi)將內(nèi)存中的內(nèi)容定時(shí)寫(xiě)入硬盤(pán)上的一個(gè)二進(jìn)制文件,同樣是以串行的方式寫(xiě)入,因此單線(xiàn)程也能更好地控制寫(xiě)操作。
單線(xiàn)程模型會(huì)不會(huì)成為Redis的瓶頸?
單線(xiàn)程模型在高并發(fā)讀操作的場(chǎng)景下可以發(fā)揮出很好的優(yōu)勢(shì),但如果是寫(xiě)操作,單線(xiàn)程模型則會(huì)成為Redis的瓶頸。
為了克服這個(gè)問(wèn)題,Redis提供了多路復(fù)用機(jī)制(IO multiplexing),使得單線(xiàn)程可以同時(shí)處理多個(gè)客戶(hù)端的請(qǐng)求,在客戶(hù)端較少的情況下,單線(xiàn)程仍然可以很好地應(yīng)對(duì),但在客戶(hù)端數(shù)量增加時(shí),單線(xiàn)程的處理能力會(huì)有所下降。
為了進(jìn)一步提高Redis的寫(xiě)入性能,Redis還提供了多實(shí)例的方式,可以通過(guò)在一臺(tái)服務(wù)器上啟動(dòng)多個(gè)Redis實(shí)例來(lái)處理寫(xiě)入操作,每個(gè)實(shí)例獨(dú)立處理寫(xiě)入請(qǐng)求,寫(xiě)入操作的性能得到進(jìn)一步提升。