Redis實現MongoDB的getlasterror功能

MongoDB有一個命令叫getlasterror,從名字上看它的作用好像是獲取最近的一個error。但其實這是MongoDB的一種客戶端阻塞的方式。官方的解釋如下:

MongoDB does not wait for a response by default when writing to the database. Use the getLastError command to ensure that operations have succeeded.

MongoDB 在寫操作時,默認不會等數據寫完後才返回,你可以通過使用getLastError命令來保證你的寫是成功的。

說白了,MongoDB的寫是異步的,返回給客戶端成功但其寫並不一定成功,而且在多個數據結點進行replication的時候,更無法保證數據同步到其它結點上。getLastError就是爲此而生的,你指定一個條件,然後這個函數會一直阻塞到服務端告知這個條件滿足了纔會返回值。(當然,爲了防止死等,這個函數還有一個超時參數),例子:

db.runCommand( { getlasterror : 1 , w : 2 } )

上面命令表示等寫操作被寫到兩個結點再返回成功。

這一功能使得數據安全性的保證更加靈活。

而最近有朋友在Redis上也實現了這一功能,實現的方式不是修改Redis源碼,而是使用現有的功能拼得出,具體過程如下:

1. Client SUBSCRIBEs to  KEY on *slave*
2. Client writes KEY (e.g. set foo bar) to master
3. Client publishes KEY to master

由於Redis的單線程寫操作,下面兩個操作會被順序執行

4. Master will replicate KEY to slave
5 Master will propogate *PUBLISH KEY* to slave

最後,在Master同步完數據後,客戶端會收到SUBSCRIBE的消息:
6. Gets KEY event on SUBSCRIBE!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章