?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
WAIT numslaves timeout
自3.0.0起可用。
時間復(fù)雜度: O(1)
該命令將阻止當(dāng)前客戶端,直到所有先前的寫入命令成功傳輸并且至少由指定數(shù)量的從站確認(rèn)。如果達到超時(以毫秒為單位),則即使尚未達到指定數(shù)量的從站,該命令也會返回。
在達到指定數(shù)量的從站或達到超時時,該命令將始終返回確認(rèn)在WAIT命令之前發(fā)送的寫入命令的從站數(shù)量。
幾句話:
當(dāng) WAIT 返回時,在當(dāng)前連接的上下文中發(fā)送的所有先前的寫入命令被保證由 WAIT 返回的從站的數(shù)量接收。
如果該命令是作為 MULTI 事務(wù)的一部分發(fā)送的,則該命令不會阻塞,而是僅返回 ASAP 確認(rèn)先前寫入命令的從站的數(shù)量。
超時0意味著永遠阻止。
由于 WAIT 返回在失敗和成功時都達到的從站數(shù)量,客戶端應(yīng)檢查返回的值是否等于或大于它所要求的復(fù)制等級。
請注意,WAIT 不會使 Redis 成為一個強大的一致性存儲:雖然同步復(fù)制是復(fù)制狀態(tài)機的一部分,但它不是唯一需要的。但是,在Sentinel或Redis群集故障轉(zhuǎn)移的情況下,WAIT 可以提高現(xiàn)實世界的數(shù)據(jù)安全性。
具體而言,如果給定的寫入被傳輸?shù)揭粋€或多個從屬設(shè)備,則更有可能(但不能保證),如果主設(shè)備出現(xiàn)故障,我們將能夠在故障轉(zhuǎn)移期間提升接收寫入的從設(shè)備:Sentinel 和 Redis Cluster 將盡最大努力嘗試在可用的從站集合中提升最佳的從站。
但是,這只是盡力而為的嘗試,所以仍然可能會丟失同步復(fù)制到多個從服務(wù)器的寫入。
由于引入了與從節(jié)點的部分重新同步(PSYNC 功能),Redis 從節(jié)點使用它們已在復(fù)制流中處理的偏移量異步地對其主節(jié)點進行ping 操作。這用于多種方式:
檢測超時的奴隸。
斷開連接后執(zhí)行部分重新同步。
實施 WAIT。
在執(zhí)行 WAIT 的特定情況下,Redis會記住,對于每個客戶端,當(dāng)給定的寫入命令在給定客戶端的上下文中執(zhí)行時,生成的復(fù)制流的復(fù)制偏移量。當(dāng)調(diào)用WAIT時,Redis會檢查指定數(shù)量的從站是否已經(jīng)確認(rèn)了此偏移量或更大的偏移量。
整數(shù)應(yīng)答:該命令返回在當(dāng)前連接的上下文中執(zhí)行的所有寫操作所達到的從服務(wù)器的數(shù)量。
> SET foo bar OK> WAIT 1 0(integer) 1> WAIT 2 1000(integer) 1
在以下示例中,首次調(diào)用 WAIT 時不使用超時,并要求寫入達到1個從站。它返回成功。在第二次嘗試中,我們放了一個超時,并要求將寫入復(fù)制到兩個從站。由于有一個可用的從站,所以在 WAIT 解除阻塞并返回1秒之后,達到了從站的數(shù)量。