單個 redis 命令的執行是原子性的,但 redis 沒有在事務上增加任何維持原子性的機制,所以 redis 事務的執行並不是原子性的。事務可以理解為乙個打包的批量執行指令碼,但批量指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做。有時候為了同時處理多個結構,我們需要向redis傳送多個命令.儘管redis有幾個可以在兩個鍵之前複製或移動元素的命令,但卻沒有那種可以在兩個不同型別之間移動元素的命令(雖然可以使用zunionstore命令將元素從乙個集合複製到另外乙個有序集合).為了對相同或者不同型別的多個鍵執行操作,redis有5個命令可以讓使用者在不被打斷(interruption)的情況下對多個鍵執行操作,他們分別是
redis的基本事務(basic transaction)需要用到multi命令和exec命令.這種事務可以讓客戶端在不被其他客戶端打斷的情況下執行多個命令.和關聯式資料庫那種可以在執行的過程進行回滾(rollback)的事務不同,在redis裡面,被multi和exec命令包圍的所有命令會乙個接乙個地執行,直到所有命令都執行完畢為止.當乙個事務執行完畢之後,redis才會處理其他客戶端的命令.
1 redis不支援回滾要在redis裡面執行事務,我們首先需要執行multi命令,然後輸入那些我們想要在事務裡面執行的命令,最後再執行exec命令.當redis從乙個客戶端那裡接受到multi命令時,redis會將這個客戶端之後傳送的命令都放入到乙個對佇列裡面,知道這個客戶端傳送exec命令為止,然後redis就會在不被打斷的情況下,乙個接乙個地執行儲存在佇列裡面的命令.從語義上來說,redis事務在python客戶端上面是由流水線(pipeline)實現的:對連線物件呼叫2 如果事務中的某一條命令出錯,剩餘命令仍然會執行。所以redis事務並不能保證原子性。
pipeline()
方法建立乙個事務.在一切正常的情況下,客戶端會自動的使用multi和exec包裹起使用者輸入的多個命令.此外,為了減少redis與客戶端之前的通訊往返次數,提公升執行多個命令的效能,python的redis客戶端會儲存起事務包含的多個命令,然後在事務執行時一次性第將所有命令都傳送給redis.
如果你具備關係型資料庫的知識背景,你就會發現乙個事實:在事務執行期間,雖然redis命令可能會執行失敗,但是redis仍然會執行事務中餘下的其他命令,而不會執行回滾操作,你可能會覺得這種行為很奇怪。
然而,這種行為也有其合理之處:
只有當被呼叫的redis命令有語法錯誤時,這條命令才會執行失敗(在將這個命令放入事務佇列期間,redis能夠發現此類問題),或者對某個鍵執行不符合其資料型別的操作:實際上,這就意味著只有程式錯誤才會導致redis命令執行失敗,這種錯誤很有可能在程式開發期間發現,一般很少在生產環境發現。對於redis事務的這種行為,有乙個普遍的反對觀點,那就是程式有可能會有缺陷(bug)。但是,你應當注意到:事務回滾並不能解決任何程式錯誤。例如,如果某個查詢會將乙個鍵的值遞增2,而不是1,或者遞增錯誤的鍵,那麼事務回滾機制是沒有辦法解決這些程式問題的。請注意,沒有人能解決程式設計師自己的錯誤,這種錯誤可能會導致redis命令執行失敗。正因為這些程式錯誤不大可能會進入生產環境,所以我們在開發redis時選用更加簡單和快速的方法,沒有實現錯誤回滾的功能。redis已經在系統內部進行功能簡化,這樣可以確保更快的執行速度,因為redis不需要事務回滾的能力。
redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證:
批量操作在傳送 exec 命令前被放入佇列快取。
收到 exec 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。
在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
乙個事務從開始到執行會經歷以下三個階段:
開始事務。
命令入隊。
執行事務。
Redis 基本的事務操作
事務有 a c i d 原則 redis事務本質 一組命令的集合!乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行!一次性 順序性 排他性,執行一系列的命令 redis事務沒有隔離級別的概念!所有的命令在事務中,並沒有直接被執行!只有發起執行命令的適合才會執行!exec redis...
Redis(八)事務的基本操作
事務的本質 一組命令一塊兒執行,乙個事務中的所有命令都會被序列化 在事務執行的過程中,都會按順序執行 一次性 順序性 排他性!執行一系列命令!佇列 set setset redis單條命令保證原子性,但是事務不保證原子性 redis沒有事務隔離級別的概念 所有的命令在事務中,並沒有直接被執行,只有發...
Redis的基本事務操作
事務 redis事務本質 一組命令的集合!乙個事務中的所有命令都會被序列化,在事務執行過程中,會按順序執行 一次性 順序性 排他性!執行一系列的命令 佇列 set set set 執行 redis事務沒有隔離級別的概念 所有的命令在事務中,並沒有直接被執行,只有發起執行命令的時候才會執行!exec ...