首頁 資料庫 Redis 你知道怎麼保證Redis的高併發嗎

你知道怎麼保證Redis的高併發嗎

Nov 10, 2020 pm 02:52 PM
redis

 下面由Redis教學專欄給大家介紹如何確保Redis的高並發,希望對需要的朋友有幫助!

  單機的redis幾乎不太可能說QPS超過10萬 ,一般在幾萬。

  除非一些特殊情況,例如你的機器性能特別好,配置特別高,物理機,維護做的特別好,而且你的整體的操作不是太複雜。

 

  Redis透過主從架構,實現讀寫分離,主節點負責寫,並將資料同步給其他從節點,從節點負責讀,從而實現高並發。

 

  Redis高並發的同時,還需要容納大量的資料:一主多從,每個實例都容納了完整的數據,例如redis主就10G的內存量,其實你就最對只能容納10g的資料量。如果你的快取要容納的資料量很大,達到了幾十g,甚至幾百g,或者是幾t,那你就需要redis集群,而且用redis集群之後,可以提供可能每秒幾十萬的讀寫並發。

 

 

replication的核心機制

  redis採用非同步方式複製資料到slave節點,不過redis 2.8開始,slave node會週期性地確認自己每次複製的資料量
  一個master node是可以配置多個slave node的
#  slave node也可以連接其他的slave node
  slave node做複製的時候,是不會block master node的正常工作的
  slave node在做複製的時候,也不會block對自己的查詢操作,它會用舊的資料集來提供服務; 但是複製完成的時候,需要刪除舊資料集,載入新資料集,這個時候就會暫停對外服務了
  slave node主要用來進行橫向擴容,做讀寫分離,擴容的slave node可以提高讀取的吞吐量

 

# master持久化對於主從架構的安全保障的意義

  如果採用了主從架構,那麼建議必須開啟master node的持久化!

  不建議用slave node作為master node的資料熱備,因為那樣的話,如果你關掉master的持久化,可能在master宕機重啟的時候資料是空的,然後可能一經過複製,salve node資料也丟了

  第二個,master的各種備份方案,要不要做,萬一說本地的所有檔案都遺失了;從備份中挑選一份rdb去恢復master; 這樣才能確保master啟動的時候,是有資料的

 

##master同步資料給slave的過程

  當啟動一個slave node的時候,它會發送一個PSYNC指令給master node

#  如果這是slave node重新連接master node,那麼master node只會複製給slave部分缺少的資料; 否則如果是slave node第一次連接master node,那麼會觸發一次full resynchronization

  開始full resynchronization的時候,master會啟動一個後台線程,開始產生一份RDB快照文件,同時還會將從客戶端收到的所有寫命令緩存在記憶體中。

  RDB檔案產生完畢之後,master會將這個RDB傳送給slave,slave會先寫入本機磁碟,然後再從本機磁碟載入到記憶體中。然後master會將記憶體中快取的寫入指令傳送給slave,slave也會同步這些資料。

  slave node如果跟master node有網路故障,斷開了連接,會自動重連。 master如果發現有多個slave node都來重新連接,只會啟動一個rdb save操作,用一份資料服務所有slave node。

 

主從複製的斷點續傳

  從redis 2.8開始,就支援主從複製的斷點續傳,如果主從複製過程中,網路連接斷掉了,那麼可以接著上次複製的地方,繼續複製下去,而不是從頭開始複製一份

  master node會在記憶體中常見一個backlog,master和slave都會保存一個replica offset還有一個master id,offset就是保存在backlog中的。

  如果master和slave網路連線斷掉了,slave會讓master從上次的replica offset開始繼續複製

  但是如果沒有找到對應的offset,那麼就會執行一次resynchronization

 

無磁碟化複製

  master在記憶體中直接創建rdb,然後發送給slave,不會在自己本地落地磁碟了

  repl-diskless-sync
  repl-diskless-sync-delay,等待一定時長再開始複製,因為要等更多slave重新連接過來

 

#過期key處理

  slave不會過期key,只會等待master過期key。

  如果master過期了一個key,或是​​透過LRU淘汰了一個key,那麼會模擬一條del指令發送給slave。

 

 

複製的完整流程

  slave node啟動,只儲存master node的訊息,包括master node的host和ip(redis.conf裡面的slaveof配置的),但是複製流程沒開始

  slave node內部有個定時任務,每秒檢查是否有新的master node要連接和複製,如果發現,就跟master node建立socket網路連線
  slave node發送ping指令給master node
#  口令認證,如果master設定了requirepass,那麼salve node必須發送masterauth的口令過去進行認證
#  master node第一次執行全量複製,將所有資料發給slave node
  master node後續持續將寫入命令,非同步複製給slave node

 

#資料同步相關的核心機制

指的就是第一次slave連接msater的時候,執行的全量複製,那個過程裡面你的一些細節的機制

(1)master和slave都會維護一個offset

  master會在自身不斷累加offset,slave也會在自身不斷累加offset
  slave每秒都會上報自己的offset給master,同時master也會保存每個slave的offset

  這個倒不是說特定就用在全量複製的,主要是master和slave都要知道各自的數據的offset,才能知道互相之間的數據不一致的情況

(2)backlog

#  master node有一個backlog,預設是1MB大小
#  master node複製slave node時,也會將資料在backlog中同步寫一份
  backlog主要是用來做全量複製中斷候的增量複製的

#(3)master run id

  info server,可以看到master run id
  如果根據host ip定位master node,是不可靠的,如果master node重啟或資料出現了變化,那麼slave node應該根據不同的run id區分,run id不同就做全量複製
  如果需要不更改run id重啟redis ,可以使用redis-cli debug reload指令

(4)psync

  從節點使用psync從master node複製,psync runid offset
  master node會根據自身的情況回傳回應訊息,可能是FULLRESYNC runid offset觸發全量複製,可能是CONTINUE觸發增量複製

全量複製

  master執行bgsave,在本機產生一份rdb快照檔案
  master node將rdb快照檔案傳送給salve node,如果rdb複製時間超過60秒(repl-timeout) ,那麼slave node就會認為複製失敗,可以適當調節大這個參數
  對於千兆網卡的機器,一般每秒傳輸100MB,6G文件,很可能超過60s
  master node在產生rdb時,會將所有新的寫入指令快取在記憶體中,在salve node儲存了rdb之後,再將新的寫入指令複製給salve node
# client-output-buffer-limit slave 256MB 64MB 60,如果在複製期間,內存緩衝區持續消耗超過64MB,或者一次性超過256MB,那麼停止複製,複製失敗
  slave node接收到rdb之後,清空自己的舊數據,然後重新加載rdb到自己的內存中,同時基於舊的數據版本對外提供服務
  如果slave node開啟了AOF,那麼會立即執行BGREWRITEAOF,重寫AOF

 

增量複製

  如果全量複製過程中,master- slave網路連線斷掉,那麼salve重新連線master時,會觸發增量複製
  master直接從自己的backlog中取得部分遺失的數據,傳送給slave node,預設backlog就是1MB
  msater就是根據slave發送的psync中的offset來從backlog中取得資料的

 

heartbeat

#  主從節點互相都會發送heartbeat訊息

  master預設每隔10秒發送一次heartbeat,salve node每隔1秒發送一個heartbeat

 

非同步複製

  master每次接收到寫入命令之後,現在內部寫入數據,然後異步發送給slave node

以上是你知道怎麼保證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)

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:12 PM

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

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

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

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:03 PM

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

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)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

See all articles