我是Redis的新手,在閱讀官方網站上的交易時,我非常困惑。Redis交易原子
- 它說
要麼所有的命令,或不進行處理,所以一個Redis的交易也是原子。
- 於是說
即使當命令失敗,在隊列中的所有其它命令被處理 -
所以它互相反對,不是嗎?
我是Redis的新手,在閱讀官方網站上的交易時,我非常困惑。Redis交易原子
要麼所有的命令,或不進行處理,所以一個Redis的交易也是原子。
即使當命令失敗,在隊列中的所有其它命令被處理 -
所以它互相反對,不是嗎?
這是關於不同的事情。 Redis有管道 - 客戶端可以一次發送很多命令到redis。管道批次內部可以是交易。 而且當事務失敗時,一個事務中的所有命令都將被丟棄,但是在執行了EXEC
命令之後的任何流水線(排隊)命令都將被執行。
欲瞭解更多信息,請參閱http://redis.io/topics/pipelining和http://redis.io/topics/transactions。
處理後的命令與失敗之間存在差異。在SQL中,如果任何命令失敗整個事務回滾,它就好像沒有完成。在redis中,命令失敗並不妨礙其他命令的處理或處理,每個失敗或獨立成功。
所以,如果您增加一個計數器,然後嘗試設置一個不同的鍵值並失敗,增量仍然發生,不會回滾。因此所有命令都是處理即使一個失敗。
簡而言之,Redis TRANSACTION擁有事務應具有的任何功能,除非它在失敗期間無法回滾。因爲redis的作者認爲失敗時的回滾函數是不必要的,所以只能由編程錯誤導致失敗。
也許我應該提一下,通過multi
系列命令實現的redis事務並不是一個好的選擇,因爲它是一種obselete函數(作者認爲Lua是一種更好的方法,並且使得multi
完全沒有必要)。使用redis Lua好得多!從Redis的作者
報價:
一個Redis的腳本是事務性的定義,所以一切都可以用Redis的交易做的,你也可以做一個腳本,通常腳本會更簡單,更快。 這種重複是由於在Redis 2.6中引入了腳本,事實早已存在。然而,我們不可能在短時間內取消對交易的支持,因爲即使不採用Redis腳本編制,仍然可以避免競爭狀況,尤其是因爲Redis交易的實施複雜性很小,所以它在語義上似乎是恰當的。 然而,在不遠的將來,我們會發現整個用戶羣只是使用腳本並不是不可能的。如果發生這種情況,我們可能會棄用並最終刪除交易。
你應該看看Lua chapter of Redis Documentation。這確實是一個更好更強大的解決方案,除了要求你知道一些Lua。
回覆如果您需要了解更多