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