Redis 事務命令詳解與例子

2021-10-09 13:40:18 字數 1769 閱讀 1331

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 詳解事務

什麼是事務?簡單點說事務就是一次批處理,給定指令碼一下性執行完畢 什麼是事務 可以一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,就像排隊一樣,不許加塞。就是指排好隊,按序一次執行一大堆命令 作用乙個佇列中,一次性 順序性 排他性的執行...