目錄
一、Redis 的阻塞點
切片叢集實例互動時的阻塞點
二、可以非同步執行的阻塞點
三、非同步的子執行緒機制
首頁 資料庫 Redis Redis的非同步機制是什麼

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

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

See all articles