Redis學習 (14)Redis 事務

2021-09-12 17:58:36 字數 1718 閱讀 8830

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 事務的執行並不是原子性的。

事務可以理解為乙個打包的批量執行指令碼,但批量指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做。

這是官網上的說明 from redis docs on transactions:

it's important to note that even when a command fails, all the other commands in the queue are processed – redis will not stop the processing of commands.

比如:

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 還會繼續執行。

序號命令及描述

1discard

取消事務,放棄執行事務塊內的所有命令。

2exec

執行所有事務塊內的命令。

3multi

標記乙個事務塊的開始。

4unwatch

取消 watch 命令對所有 key 的監視。

5watch key [key ...]

監視乙個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。

14 Redis編碼優化

二 redis物件和編碼 三 其他 四 小結 五 參考 typedef struct redisobject robj 字段 含義相關命令 type 物件型別 type keyname encoding 物件編碼 object encoding keyname refcount 物件引用計數 obj...

14 Redis 分布式鎖

有這樣乙個情境,執行緒a和執行緒b都共享某個變數x 分布式鎖可以基於很多種方式實現,比如zookeeper redis 不管哪種方式,他的基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶端對redis...

14 Redis如何處理客戶端連線

redis通過在tcp埠上進行監聽,或者unix socket 如果啟用 的方式來接受客戶端的連線。當乙個新的客戶端連線被接受執行以下操作 如果它因為當前已經接受了最大數量的客戶端,無法接受當前的客戶端,redis將嘗試傳送乙個錯誤給客戶端以便讓其意識到這種情況,並且立即關閉連線。即使連線被redi...