Redis阻塞的情況有哪些
指令阻塞
使用不當的指令造成客戶端阻塞:
keys * :取得所有的key 動作;
-
Hgetall:傳回哈希表中所有的欄位和;
smembers:傳回集合中的所有成員;
阻塞主執行緒。
同步持久化當Redis 直接記錄AOF 日誌時,如果有大量的寫入操作,並且配置為同步持久化appendfsync always
- fork 出一個子執行緒來將檔案重寫,在執行
BGREWRITEAOF
指令時,Redis 伺服器會維護一個AOF重寫緩衝區,該緩衝區會在子執行緒建立新AOF 檔案期間,記錄伺服器執行的所有寫入命令。
- 當子執行緒完成建立新AOF 檔案的工作之後,伺服器會將重寫緩衝區中的所有內容追加到新AOF 檔案的末尾,使得新的AOF 檔案保存的資料庫狀態與現有的資料庫狀態一致。
- 最後,伺服器用新的 AOF 文件取代舊的 AOF 文件,以完成 AOF 文件重寫操作。
阻塞。
AOF 日誌AOF 的日誌記錄不像關係型資料庫一樣在執行指令之前記錄日誌(方便故障復原),而是採用先執行指令後記錄日誌的方式。 原因就是AOF 記錄日誌是不會對指令進行語法檢查的,這樣就能減少額外的檢查開銷,不會對目前指令的執行產生阻塞,但可能會為下一個操作帶來阻塞風險。這是因為AOF 日誌也是在主執行緒中執行的,如果在把日誌檔案寫入磁碟時,磁碟寫入壓力大,就會導致寫碟很慢,進而導致後續的操作也無法執行了。
大 Key 問題大 key 不是指 key 的值很大,而是 key 對應的 value 很大。 大key 造成的阻塞問題如下:- 客戶端逾時阻塞:由於Redis 執行指令是單執行緒處理,然後在操作大key 時會比較耗時,那麼就會阻塞Redis,從客戶端這個視角看,就是很久很久都沒有回應。
- 引發網路阻塞:每次取得大key 產生的網路流量較大,如果一個key 的大小是1 MB,每秒存取量為1000,那麼每秒會產生1000MB的流量,這對普通千兆網卡的伺服器來說是災難性的。
- 阻塞工作線程:如果使用 del 刪除大 key 時,會阻塞工作線程,這樣就沒辦法處理後續的指令。
--bigkeys 參數尋找大key 時,最好選擇在從節點上執行該指令,因為主節點上執行時,會
阻塞主節點。
- 我們也可以使用SCAN 指令來尋找大key;
- #為了辨識大鍵,需要先確保Redis 使用了RDB 持久化,並分析對應的RDB 文件。網路上有現成的工具:
- redis-rdb-tools:Python 語言寫的用來分析Redis 的RDB 快照檔案用的工具
- 這個工具叫做rdb_bigkeys,是由Go 語言編寫的,可用於分析Redis 的RDB 快照文件,具有更高的效能。
作業系統需要把釋放掉的記憶體區塊插入一個空閒記憶體區塊的鍊錶 ,以便後續進行管理和再分配。這個過程本身需要一定時間,而且會阻塞目前釋放記憶體的應用程式。
所以,如果一下子釋放了大量內存,空閒內存塊鍊錶操作時間就會增加,相應地就會造成Redis主線程的阻塞,如果主線程發生了阻塞,其他所有請求可能都會逾時,逾時越來越多,會造成Redis 連線耗盡,產生各種異常。
刪除大 key 時建議採用分批次刪除和非同步刪除的方式進行。
清空資料庫
清空資料庫和上面 bigkey 刪除也是同樣道理,flushdb、flushall 也涉及刪除和釋放所有的鍵值對,也是 Redis 的阻塞點。
叢集擴容
Redis 叢集可以進行節點的動態擴容縮容,這個過程目前仍處於半自動狀態,需要手動介入。
在擴縮容的時候,需要進行資料遷移。而 Redis 為了確保遷移的一致性,遷移所有操作都是同步操作。
執行遷移時,兩端的Redis 均會進入時長不等的阻塞狀態,對於小Key,該時間可以忽略不計,但如果一旦Key 的記憶體使用過大,嚴重的時候會接觸發集群內的故障轉移,造成不必要的切換。
以上是Redis阻塞的情況有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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