搜尋
首頁資料庫RedisRedis的非同步機制是什麼

Redis的非同步機制是什麼

Jun 01, 2023 pm 08:14 PM
redis

一、Redis 的阻塞點

和Redis 實例交互的對象,以及交互時會發生的操作:

  • 客戶端:網路IO,鍵值對增刪改查操作,資料庫操作;

  • 磁碟:產生RDB 快照,記錄AOF 日誌,AOF 日誌重寫;

  • 主從節點:主庫產生、傳輸RDB 文件,從庫接收RDB 文件、清空資料庫、載入RDB 文件;

  • ##切片叢集實例:傳送哈希槽訊息,資料遷移。

4 類別互動物件和具體的操作之間的關係:

Redis的非同步機制是什麼

和客戶端互動時的阻塞點:

網路IO 有時候會比較慢,但是Redis 使用了IO 多路復用機制,避免了主執行緒一直處在等待網路連線或請求到來的狀態,所以網路IO

不是導致Redis 阻塞的因素。

Redis 主執行緒的主要任務是執行與客戶端互動的鍵值對的增刪改查操作。複雜度高的增刪改查操作肯定會阻塞 Redis。

判斷操作複雜度高低的標準:看操作的

複雜度是否為 O(N)

Redis 的第一個阻塞點:集合全量查詢與聚合操作:

Redis 中涉及集合的操作複雜度通常為 O(N),使用時需重視。

例如集合元素
全量查詢操作 HGETALL、SMEMBERS,以及集合的聚合統計操作,例如求交、並和差集。

Redis 的第二個阻塞點 :bigkey 刪除操作

集合本身的刪除操作同樣也有潛在的阻塞風險。刪除操作的本質是要釋放鍵值對所佔用的記憶體空間。釋放記憶體只是第一步,為了更有效率地管理記憶體空間,當應用程式釋放記憶體時,作業系統需要把釋放掉的記憶體區塊插入空閒記憶體區塊的鍊錶,以便後續進行管理再分配。

這個過程本身需要一定時間,而且會阻塞當前釋放內存的應用程序,如果一下子釋放了大量內存,空閒內存塊鍊錶操作時間就會增加,相應地就會造成Redis 主線程的阻塞。

釋放大量記憶體的時機:在刪除大量鍵值對資料的時候,刪除包含了大量元素的集合,也稱為

bigkey 刪除

不同元素數量的集合在進行刪除運算時所消耗的時間:

Redis的非同步機制是什麼

得出三個結論:

  • 當元素數量從10 萬增加到100 萬時,4 大集合類型的刪除時間的增長幅度從5 倍上升到了近20 倍;

  • 集合元素越大,刪除所花費的時間就越長;

  • 刪除一個包含100萬個元素的集合時,Hash類型的最大刪除時間已經達到了1.98秒的絕對值。一般情況下,Redis 回應時間在微秒級別,但如果某個操作需要近2秒的執行時間,則會阻塞主線程,這是無法避免的。

Redis 的第三個阻塞點:清空資料庫

既然頻繁刪除鍵值對都是潛在的阻塞點了,在Redis 的資料庫層級操作中,清空資料庫(例如FLUSHDB 和FLUSHALL 操作)也是一個潛在的阻塞風險,因為它涉及刪除和釋放所有的鍵值對。

Redis 的第四個阻塞點:AOF 日誌同步寫入

磁碟 IO 一般都是比較費時費力的,需要重點關注。 Redis 開發者早已意識到磁碟 IO 會帶來阻塞,所以把 Redis 設計成採用子程序的方式產生 RDB 快照檔、執行 AOF 日誌重寫操作。由子程序負責執行,慢速的磁碟 IO 就不會阻塞主執行緒了。

如果 Redis 直接記錄 AOF 日誌,它會利用不同的寫入策略將資料寫入磁碟。一個同步寫磁碟的操作的耗時大約是 1~2ms,如果有大量的寫入操作需要記錄在 AOF 日誌中,並同步寫回的話,會阻塞主執行緒。

Redis 的第五個阻塞點:從庫載入 RDB 檔案

在主從叢集中,主庫需要產生 RDB 文件,並傳送給從函式庫。

主庫在複製的過程中,

建立和傳輸 RDB 檔案都是由子程序來完成的,不會阻塞主執行緒。 但從程式庫接收了 RDB 檔案後,就需要使用 FLUSHDB 指令清空目前資料庫,剛好撞上了第三個阻塞點。

從庫在清空當前資料庫後,需要把 RDB 檔案載入到內存,這個過程的快慢和 RDB 檔案的大小密切相關,RDB 檔案越大,載入過程越慢。

切片叢集實例互動時的阻塞點

部署Redis 切片叢集時,每個Redis 實例上指派的雜湊槽資訊需要在不同實例間傳遞,當需要進行負載平衡或有實例增刪時,資料會在不同的實例間進行遷移。不過哈希槽的資訊量不大,而資料遷移是漸進式執行的,這兩類操作對 Redis 主執行緒的阻塞風險不大。

如果使用了 Redis Cluster 方案,而且同時剛好遷移的是 bigkey 的話,就會造成主執行緒的阻塞,因為 Redis Cluster 使用了同步遷移。

五個阻塞點:

  • 集合全量查詢與聚合運算;

  • bigkey 刪除;

  • 清空資料庫;

  • AOF 日誌同步寫入;

  • 從庫載入RDB 檔案。

二、可以非同步執行的阻塞點

為了避免阻塞式操作,Redis 提供了非同步執行緒機制:

Redis 會啟動一些子線程,然後把一些任務交給這些子線程,讓它們在後台完成,而不再由主線程來執行這些任務。可以避免阻塞主執行緒。

非同步執行對操作的要求:

一個能被非同步執行的操作並不是Redis 主執行緒的關鍵路徑上的操作(客戶端把請求傳送給Redis 後,等著Redis傳回資料結果的操作)。

Redis的非同步機制是什麼

主執行緒接收到操作1 後,操作1 並不用給客戶端回傳特定的數據,主執行緒可以把它交給後台子執行緒來完成,同時只要給客戶端回傳一個「OK」結果就行。
在子執行緒執行操作1 的時候,客戶端又向Redis 實例發送了操作2,客戶端是需要使用操作2 回傳的資料結果的,如果操作2 不回傳結果,那麼客戶端將一直處於等待狀態。

操作 1 就不算關鍵路徑上的操作,因為它不用給客戶端回傳具體數據,所以可以由後台子執行緒異步執行。
操作 2 需要把結果回傳給客戶端,它就是關鍵路徑上的操作,所以主執行緒必須立即把這個操作執行完。

  • Redis 讀取操作是典型的關鍵路徑操作,因為客戶端發送了讀取操作之後,就會等待讀取的資料返回,以便進行後續的資料處理。而 Redis 的第一個阻塞點「集合全量查詢 和聚合操作」都涉及到了讀取操作,不能進行非同步操作。

  • 不需要將特定的資料結果傳回給客戶端的刪除操作不屬於關鍵路徑操作。 "Both 'bigkey deletion' and 'database clearance' involve deleting data, but they are not on the critical path."。可以使用後台子執行緒來非同步執行刪除操作。

  • “AOF 日誌同步寫入”,為了確保資料可靠性,Redis 實例需要保證AOF 日誌中的操作記錄已經落盤,這個操作雖然需要實例等待,但它並不會傳回具體的資料結果給實例。所以可以啟動一個子執行緒來執行 AOF 日誌的同步寫入。

  • 為了提供客戶端資料存取服務,必須載入完整的 RDB 檔案。這個操作也屬於關鍵路徑上的操作,必須讓從函式庫的主執行緒來執行。

除了“集合全量查詢和聚合操作”和“從庫加載RDB 文件”,其他三個阻塞點涉及的操作都不在關鍵路徑上,可以使用Redis 的非同步子執行緒機制來實作bigkey 刪除,清空資料庫,以及AOF 日誌同步寫入。

三、非同步的子執行緒機制

Redis 主執行緒啟動後,會使用作業系統提供的pthread_create 函數建立3 個子執行緒,負責AOF 日誌寫入操作、鍵值對刪除、檔案關閉的非同步執行。

主執行緒透過一個鍊錶形式的任務佇列和子執行緒進行互動。

當收到鍵值對刪除和清空資料庫的操作時,主執行緒會把這個操作封裝成一個任務,放入到任務佇列中,然後給客戶端傳回一個完成訊息,表示刪除已經完成。

但實際上,這個時候刪除還沒有執行,等到後台子執行緒從任務佇列中讀取任務後,才開始實際刪除鍵值對,並釋放對應的記憶體空間。這種非同步刪除也稱為惰性刪除 (lazy free)。

當 AOF 日誌配置成 everysec 選項後,主執行緒會把 AOF 寫日誌操作封裝成任務,也放到任務佇列中。一種重寫方式是: 當後台子執行緒讀取到任務後,即開始自行記錄到AOF日誌,主執行緒即可脫離對AOF日誌的依賴而繼續運作。

Redis 中的非同步子執行緒執行機制:

Redis的非同步機制是什麼

#

異步的鍵值對刪除和資料庫清空操作是Redis 4.0 後提供的功能,Redis 也提供了新的命令來執行這兩個操作:

  • 鍵值對刪除:集合類型中有大量元素(例如有百萬等級或千萬等級元素)需要刪除時,建議使用UNLINK 指令;

  • 清空資料庫:可以在FLUSHDB 和FLUSHALL 指令後面加上ASYNC 選項,讓後台子執行緒非同步地清空資料庫。

FLUSHDB ASYNC 
FLUSHALL AYSNC

以上是Redis的非同步機制是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
REDIS:了解其架構和目的REDIS:了解其架構和目的Apr 26, 2025 am 12:11 AM

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

REDIS與SQL數據庫:關鍵差異REDIS與SQL數據庫:關鍵差異Apr 25, 2025 am 12:02 AM

Redis和SQL數據庫的主要區別在於:Redis是內存數據庫,適用於高性能和靈活性需求;SQL數據庫是關係型數據庫,適用於復雜查詢和數據一致性需求。具體來說,1)Redis提供高速數據訪問和緩存服務,支持多種數據類型,適用於緩存和實時數據處理;2)SQL數據庫通過表格結構管理數據,支持複雜查詢和事務處理,適用於電商和金融系統等需要數據一致性的場景。

REDIS:它如何充當數據存儲和服務REDIS:它如何充當數據存儲和服務Apr 24, 2025 am 12:08 AM

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

REDIS與其他數據庫:比較分析REDIS與其他數據庫:比較分析Apr 23, 2025 am 12:16 AM

Redis與其他數據庫相比,具有以下獨特優勢:1)速度極快,讀寫操作通常在微秒級別;2)支持豐富的數據結構和操作;3)靈活的使用場景,如緩存、計數器和發布訂閱。選擇Redis還是其他數據庫需根據具體需求和場景,Redis在高性能、低延遲應用中表現出色。

REDIS的角色:探索數據存儲和管理功能REDIS的角色:探索數據存儲和管理功能Apr 22, 2025 am 12:10 AM

Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

REDIS:了解NOSQL概念REDIS:了解NOSQL概念Apr 21, 2025 am 12:04 AM

Redis是一種NoSQL數據庫,適用於大規模數據的高效存儲和訪問。 1.Redis是開源的內存數據結構存儲系統,支持多種數據結構。 2.它提供極快的讀寫速度,適合緩存、會話管理等。 3.Redis支持持久化,通過RDB和AOF方式確保數據安全。 4.使用示例包括基本的鍵值對操作和高級的集合去重功能。 5.常見錯誤包括連接問題、數據類型不匹配和內存溢出,需注意調試。 6.性能優化建議包括選擇合適的數據結構和設置內存淘汰策略。

REDIS:現實世界的用例和示例REDIS:現實世界的用例和示例Apr 20, 2025 am 12:06 AM

Redis在現實世界中的應用包括:1.作為緩存系統加速數據庫查詢,2.存儲Web應用的會話數據,3.實現實時排行榜,4.作為消息隊列簡化消息傳遞。 Redis的多功能性和高性能使其在這些場景中大放異彩。

REDIS:探索其功能和功能REDIS:探索其功能和功能Apr 19, 2025 am 12:04 AM

Redis脫穎而出是因為其高速、多功能性和豐富的數據結構。 1)Redis支持字符串、列表、集合、散列和有序集合等數據結構。 2)它通過內存存儲數據,支持RDB和AOF持久化。 3)從Redis6.0開始引入多線程處理I/O操作,提升了高並發場景下的性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具