成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

美團二面:細數 Redis 阻塞的九種情況

數據庫 Redis
大家都知道 Redis 在進行 RDB 快照的時候,會調用系統函數 fork() ,創建一個子線程來完成臨時文件的寫入,而觸發條件正是配置文件中的 save 配置。

哈嘍大家好,我是阿Q!

前兩天去美團面試的陳同學回來了,看他滿臉泄氣的樣子,準是沒拿到 Offer。

聽了他面試的經過,真替他感到惋惜。究其原因,是被一道面試題攔住了去路:看你簡歷上寫著精通 Redis,請你總結一下 Redis 中存在的阻塞問題吧。

正好阿Q這幾天正在研究 Redis,就順便在這兒給大家做個總結。

命令阻塞

使用不當的命令造成客戶端阻塞:

  • keys * :獲取所有的 key 操作;
  • Hgetall:返回哈希表中所有的字段和;
  • smembers:返回集合中的所有成員;

這些命令時間復雜度是O(n),有時候也會全表掃描,隨著n的增大耗時也會越大從而導致客戶端阻塞。

SAVE 阻塞

大家都知道 Redis 在進行 RDB 快照的時候,會調用系統函數 fork() ,創建一個子線程來完成臨時文件的寫入,而觸發條件正是配置文件中的 save 配置。

當達到我們的配置時,就會觸發 bgsave 命令創建快照,這種方式是不會阻塞主線程的,而手動執行 save 命令會在主線程中執行,阻塞主線程。

同步持久化

當 Redis 直接記錄 AOF 日志時,如果有大量的寫操作,并且配置為同步持久化

appendfsync always

即每次發生數據變更會被立即記錄到磁盤,因為寫磁盤比較耗時,性能較差,所以有時會阻塞主線程。

AOF 重寫

  1. fork 出一條子線程來將文件重寫,在執行 BGREWRITEAOF 命令時,Redis 服務器會維護一個 AOF 重寫緩沖區,該緩沖區會在子線程創建新 AOF 文件期間,記錄服務器執行的所有寫命令。
  2. 當子線程完成創建新 AOF 文件的工作之后,服務器會將重寫緩沖區中的所有內容追加到新 AOF 文件的末尾,使得新的 AOF 文件保存的數據庫狀態與現有的數據庫狀態一致。
  3. 最后,服務器用新的 AOF 文件替換舊的 AOF 文件,以此來完成 AOF 文件重寫操作。

阻塞就是出現在第2步的過程中,將緩沖區中新數據寫到新文件的過程中會產生阻塞。

AOF 日志

AOF 的日志記錄不像關系型數據庫那樣在執行命令之前記錄日志(方便故障恢復),而是采用先執行命令后記錄日志的方式。

原因就是 AOF 記錄日志是不會對命令進行語法檢查的,這樣就能減少額外的檢查開銷,不會對當前命令的執行產生阻塞,但可能會給下一個操作帶來阻塞風險。

這是因為 AOF 日志也是在主線程中執行的,如果在把日志文件寫入磁盤時,磁盤寫壓力大,就會導致寫盤很慢,進而導致后續的操作也無法執行了。

大 Key 問題

大 key 并不是指 key 的值很大,而是 key 對應的 value 很大。

大 key 造成的阻塞問題如下:

  • 客戶端超時阻塞:由于 Redis 執行命令是單線程處理,然后在操作大 key 時會比較耗時,那么就會阻塞 Redis,從客戶端這一視角看,就是很久很久都沒有響應。
  • 引發網絡阻塞:每次獲取大 key 產生的網絡流量較大,如果一個 key 的大小是 1 MB,每秒訪問量為 1000,那么每秒會產生 1000MB 的流量,這對于普通千兆網卡的服務器來說是災難性的。
  • 阻塞工作線程:如果使用 del 刪除大 key 時,會阻塞工作線程,這樣就沒辦法處理后續的命令。

查找大 key

當我們在使用 Redis 自帶的 --bigkeys 參數查找大 key 時,最好選擇在從節點上執行該命令,因為主節點上執行時,會阻塞主節點。

  • 我們還可以使用 SCAN 命令來查找大 key;
  • 通過分析 RDB 文件來找出 big key,這種方案的前提是 Redis 采用的是 RDB 持久化。網上有現成的工具:

redis-rdb-tools:Python 語言寫的用來分析 Redis 的 RDB 快照文件用的工具

rdb_bigkeys:Go 語言寫的用來分析 Redis 的 RDB 快照文件用的工具,性能更好。

刪除大 key

刪除操作的本質是要釋放鍵值對占用的內存空間。

釋放內存只是第一步,為了更加高效地管理內存空間,在應用程序釋放內存時,操作系統需要把釋放掉的內存塊插入一個空閑內存塊的鏈表,以便后續進行管理和再分配。這個過程本身需要一定時間,而且會阻塞當前釋放內存的應用程序。

所以,如果一下子釋放了大量內存,空閑內存塊鏈表操作時間就會增加,相應地就會造成 Redis 主線程的阻塞,如果主線程發生了阻塞,其他所有請求可能都會超時,超時越來越多,會造成 Redis 連接耗盡,產生各種異常。

刪除大 key 時建議采用分批次刪除和異步刪除的方式進行。

清空數據庫

清空數據庫和上面 bigkey 刪除也是同樣道理,flushdb、flushall 也涉及到刪除和釋放所有的鍵值對,也是 Redis 的阻塞點。

集群擴容

Redis 集群可以進行節點的動態擴容縮容,這一過程目前還處于半自動狀態,需要人工介入。

在擴縮容的時候,需要進行數據遷移。而 Redis 為了保證遷移的一致性,遷移所有操作都是同步操作。

執行遷移時,兩端的 Redis 均會進入時長不等的阻塞狀態,對于小Key,該時間可以忽略不計,但如果一旦 Key 的內存使用過大,嚴重的時候會觸發集群內的故障轉移,造成不必要的切換。

責任編輯:武曉燕 來源: 阿Q說代碼
相關推薦

2023-04-21 13:57:38

Redis阻塞半自動

2023-04-03 10:24:00

spring事務場景

2022-09-08 13:56:49

MySQL事務記錄鎖

2021-06-04 09:56:12

RedisMySQL美團

2024-08-06 09:42:23

2024-04-01 00:00:00

Redis緩存服務消息隊列

2025-06-05 03:10:00

mmapmalloc共享內存

2024-04-15 08:37:35

2024-05-27 11:35:40

2024-04-24 09:02:58

線程池面試鎖升級

2024-10-31 08:50:14

2022-08-27 13:50:44

TCP服務端函數

2023-02-27 09:03:23

JavaCAS

2025-03-25 12:00:00

@Value?Spring開發

2022-09-12 15:55:57

TCP函數程序

2013-08-20 13:11:58

技術美團

2024-03-28 08:32:10

美團關閉訂單輪訓

2021-12-26 18:24:51

MySQL InnoDB引擎

2022-03-03 16:45:02

美團述職反饋

2023-07-13 09:16:47

循環隊列指針front?
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜精品一区二区三区在线视 | www.精品国产 | 久久中文字幕av | 久久久久国产一区二区三区 | 日韩成人一区 | 国产一区二区三区四区在线观看 | 欧美福利视频 | 欧美成人免费电影 | 无码一区二区三区视频 | 中文字幕在线视频免费观看 | 日本色高清 | 99久久免费精品视频 | 日韩成人在线视频 | 国产一级免费视频 | 日韩在线一区二区三区 | 丝袜 亚洲 另类 欧美 综合 | 亚洲一区二区成人 | 草草在线观看 | 毛片区| 少妇黄色| 国产一区二区三区在线 | 天天操夜夜艹 | 日韩av在线免费 | 精品视频免费在线 | 日本在线看片 | 中文精品视频 | 国产成人高清 | 国产片侵犯亲女视频播放 | www.久草.com | 亚洲精品一区二区网址 | 日韩影院在线 | 91精品国产一区二区三区 | 一区二区三区在线观看免费视频 | 久久久这里都是精品 | 国产一区二区久久久 | 春色av| 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 色香蕉在线 | 狠狠干美女 | 欧美1区2区 | 亚洲一区中文字幕 |