引言
????????隨著技術(shù)發(fā)展的日新月異,Redis作為業(yè)界知名的開源內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),在不斷演進中為開發(fā)者帶來了眾多令人矚目的新特性。在2020年4月底正式發(fā)布的Redis 6.0版本中,一系列重大改進不僅提升了性能和擴展性,更強化了安全性及管理靈活性。本文將深入探討Redis 6.0的關(guān)鍵新特性及其對開發(fā)實踐的影響。
? ? ? ? Redis 6.0 中的幾個關(guān)鍵新特性,分別是面向網(wǎng)絡(luò)處理的多IO線程、客戶端緩存、細(xì)粒度的權(quán)限控制,以及RESP 3協(xié)議的使用。
多線程IO處理
????????在 Redis 6.0 中,非常受關(guān)注的第一個新特性就是多線程。這是因為,Redis 一直被大家熟知的就是它的單線程架構(gòu),雖然有些命令操作可以用后臺線程或子進程執(zhí)行(比如數(shù)據(jù)刪除、快照生成、AOF 重寫),但是,從網(wǎng)絡(luò) IO 處理到實際的讀寫命令處理,都是由單個線程完成的。
????????隨著網(wǎng)絡(luò)硬件的性能提升,Redis 的性能瓶頸有時會出現(xiàn)在網(wǎng)絡(luò) IO 的處理上,也就是說,單個主線程處理網(wǎng)絡(luò)請求的速度跟不上底層網(wǎng)絡(luò)硬件的速度。
????????Redis 的多 IO 線程只是用來處理網(wǎng)絡(luò)請求的,對于讀寫命令,Redis 仍然使用單線程來處理。這是因為,Redis 處理請求時,網(wǎng)絡(luò)處理經(jīng)常是瓶頸,通過多個 IO 線程并行處理網(wǎng)絡(luò)操作,可以提升實例的整體處理性能。而繼續(xù)使用單線程執(zhí)行命令操作,就不用為了保證 Lua 腳本、事務(wù)的原子性,額外開發(fā)多線程互斥機制了。這樣一來,Redis 線程模型實現(xiàn)就簡單了。
????????在 Redis 6.0 中,主線程和 IO 線程具體是怎么協(xié)作完成請求處理的。掌握了具體原理,才能真正地會用多線程。為了方便理解,我們可以把主線程和多 IO 線程的協(xié)作分成四個階段。
????????1、服務(wù)端和客戶端建立 Socket 連接,并分配處理線程。首先,主線程負(fù)責(zé)接收建立連接請求。當(dāng)有客戶端請求和實例建立 Socket 連接時,主線程會創(chuàng)建和客戶端的連接,并把 Socket 放入全局等待隊列中。緊接著,主線程通過輪詢方法把 Socket 連接分配給 IO 線程。
?????????2、IO 線程讀取并解析請求。主線程一旦把 Socket 分配給 IO 線程,就會進入阻塞狀態(tài),等待 IO 線程完成客戶端請求讀取和解析。因為有多個 IO 線程在并行處理,所以,這個過程很快就可以完成。
????????3、主線程執(zhí)行請求操作。等到 IO 線程解析完請求,主線程還是會以單線程的方式執(zhí)行這些命令操作。
????????4、IO 線程回寫 Socket 和主線程清空全局隊列。當(dāng)主線程執(zhí)行完請求操作后,會把需要返回的結(jié)果寫入緩沖區(qū),然后,主線程會阻塞等待 IO 線程把這些結(jié)果回寫到 Socket 中,并返回給客戶端。
????????和 IO 線程讀取和解析請求一樣,IO 線程回寫 Socket 時,也是有多個線程在并發(fā)執(zhí)行,所以回寫 Socket 的速度也很快。等到 IO 線程回寫 Socket 完畢,主線程會清空全局隊列,等待客戶端的后續(xù)請求。
客戶端緩存
????????Redis 6.0 新增了一個重要的特性,就是實現(xiàn)了服務(wù)端協(xié)助的客戶端緩存功能,也稱為跟蹤(Tracking)功能。有了這個功能,業(yè)務(wù)應(yīng)用中的 Redis 客戶端就可以把讀取的數(shù)據(jù)緩存在業(yè)務(wù)應(yīng)用本地了,應(yīng)用就可以直接在本地快速讀取數(shù)據(jù)了。
????????當(dāng)把數(shù)據(jù)緩存在客戶端本地時,我們會面臨一個問題:如果數(shù)據(jù)被修改了或是失效了,如何通知客戶端對緩存的數(shù)據(jù)做失效處理?6.0 實現(xiàn)的 Tracking 功能實現(xiàn)了兩種模式,來解決這個問題。
????????第一種模式是普通模式。在這個模式下,實例會在服務(wù)端記錄客戶端讀取過的 key,并監(jiān)測 key 是否有修改。一旦 key 的值發(fā)生變化,服務(wù)端會給客戶端發(fā)送 invalidate 消息,通知客戶端緩存失效了。使用普通模式時,有一點你需要注意一下,服務(wù)端對于記錄的 key 只會報告一次 invalidate 消息,也就是說,服務(wù)端在給客戶端發(fā)送過一次 invalidate 消息后,如果 key 再被修改,此時,服務(wù)端就不會再次給客戶端發(fā)送 invalidate 消息。
????????只有當(dāng)客戶端再次執(zhí)行讀命令時,服務(wù)端才會再次監(jiān)測被讀取的 key,并在 key 修改時發(fā)送 invalidate 消息。這樣設(shè)計的考慮是節(jié)省有限的內(nèi)存空間。畢竟,如果客戶端不再訪問這個 key 了,而服務(wù)端仍然記錄 key 的修改情況,就會浪費內(nèi)存資源。
????????第二種模式是廣播模式。這個模式下,服務(wù)端會給客戶端廣播所有 key 的失效情況,不過,這樣做了之后,如果 key 被頻繁修改,服務(wù)端會發(fā)送大量的失效廣播消息,這就會消耗大量的網(wǎng)絡(luò)帶寬資源。
????????所以,在實際應(yīng)用時,我們會讓客戶端注冊希望跟蹤的 key 的前綴,當(dāng)帶有注冊前綴的 key 被修改時,服務(wù)端會把失效消息廣播給所有注冊的客戶端。和普通模式不同,在廣播模式下,即使客戶端還沒有讀取過 key,但只要它注冊了要跟蹤的 key,服務(wù)端都會把 key 失效消息通知給這個客戶端。
Access Control Lists (ACL) 權(quán)限系統(tǒng)
????????Redis 6.0全面引入了訪問控制列表(ACL)功能,它允許管理員為不同用戶分配精細(xì)到命令級別的權(quán)限,告別以往單一密碼管理所有資源的局面。這一變革使得 Redis 在大型組織和復(fù)雜環(huán)境中能夠更好地適應(yīng)嚴(yán)格的權(quán)限管理和審計需求。
啟用 RESP 3 協(xié)議
????????Redis 6.0 實現(xiàn)了 RESP 3 通信協(xié)議,而之前都是使用的 RESP 2。在 RESP 2 中,客戶端和服務(wù)器端的通信內(nèi)容都是以字節(jié)數(shù)組形式進行編碼的,客戶端需要根據(jù)操作的命令或是數(shù)據(jù)類型自行對傳輸?shù)臄?shù)據(jù)進行解碼,增加了客戶端開發(fā)復(fù)雜度。
????????而 RESP 3 直接支持多種數(shù)據(jù)類型的區(qū)分編碼,包括空值、浮點數(shù)、布爾值、有序的字典集合、無序的集合等。文章來源:http://www.zghlxwxcb.cn/news/detail-800757.html
結(jié)論
????????Redis 6.0版本的發(fā)布標(biāo)志著其在保證傳統(tǒng)優(yōu)勢的同時,正朝著更加現(xiàn)代化、安全化和可擴展化的方向邁進。這些新特性無疑將進一步鞏固Redis在高速緩存、持久化存儲以及實時數(shù)據(jù)處理領(lǐng)域的領(lǐng)先地位,賦能更多企業(yè)和開發(fā)者實現(xiàn)高效率、高性能的應(yīng)用架構(gòu)設(shè)計。對于正在尋找靈活、安全且高性能數(shù)據(jù)存儲方案的團隊來說,Redis 6.0無疑是值得深入研究和采用的重要選擇。文章來源地址http://www.zghlxwxcb.cn/news/detail-800757.html
到了這里,關(guān)于Redis 6.0進化之路:關(guān)鍵新特性詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!