redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:
總結說:redis事務就是一次性、順序性、排他性的執行乙個佇列中的一系列命令。乙個事務從開始到執行會經歷以下三個階段:
redis事務沒有隔離級別的概念:
批量操作在傳送 exec 命令前被放入佇列快取,並不會被實際執行,也就不存在事務內的查詢要看到事務裡的更新,事務外查詢不能看到。
redis不保證原子性:
redis中,單條命令是原子性執行的,但事務不保證原子性,且沒有回滾。事務中任意命令執行失敗,其餘的命令仍會被執行。
以下是乙個事務的例子, 它先以 multi 開始乙個事務, 然後將多個命令入隊到事務中, 最後由 exec 命令觸發事務, 一併執行事務中的所有命令:
redis 127.0.0.1:6379> multi
okredis 127.0.0.1:6379> set book-name "mastering c++ in 21 days"
queued
redis 127.0.0.1:6379> get book-name
queued
redis 127.0.0.1:6379> sadd tag "c++"
"programming"
"mastering series"
queued
redis 127.0.0.1:6379> smembers tag
queued
redis 127.0.0.1:6379> exec
1) ok
2)"mastering c++ in 21 days"
3)(integer) 3
4) 1)
"mastering series"
2)"c++"
3)"programming"
單個 redis 命令的執行是原子性的,但 redis 沒有在事務上增加任何維持原子性的機制,所以 redis 事務的執行並不是原子性的。
事務可以理解為乙個打包的批量執行指令碼,但批量指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做。
比如:
redis 127.0.0.1:7000> multi
okredis 127.0.0.1:7000>
set a aaa
queued
redis 127.0.0.1:7000>
set b bbb
queued
redis 127.0.0.1:7000>
set c ccc
queued
redis 127.0.0.1:7000>
exec
1) ok
2) ok
3) ok
如果在 set b bbb 處失敗,set a 已成功不會回滾,set c 還會繼續執行。
序號命令描述1
discard
取消事務,放棄執行事務塊內的所有命令。
2exec
執行所有事務塊內的命令。
3multi
標記乙個事務塊的開始。
4unwatch
取消 watch 命令對所有 key 的監視。
5watch key [key …]
監視乙個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
參考:
Redis事務命令與原理
開始事務 multi在執行 multi 命令後,後面執行的非事務相關的命令都會被加入事務佇列,等待事務執行 執行事務 exec執行 multi 和 exec 之間的命令,並統一返回 監視鍵watch key key 監視乙個或多個鍵,如果監視的鍵的值發生了改變,那麼事務將不被執行,並且返回 nil。...
Redis 事務 詳解
redis 事務可以一次執行多個命令,並且帶有以下兩個重要的保證 1 事務是乙個單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷 2 事務是乙個原子操作 事務中的命令要麼全部被執行,要麼全部都不執行 乙個事務從開始到執行會經歷以下三...
Redis 詳解事務
什麼是事務?簡單點說事務就是一次批處理,給定指令碼一下性執行完畢 什麼是事務 可以一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,就像排隊一樣,不許加塞。就是指排好隊,按序一次執行一大堆命令 作用乙個佇列中,一次性 順序性 排他性的執行...