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