redis 事務操作

2021-07-27 13:20:00 字數 2185 閱讀 7148

redis事務操作

multi 命令用於開啟乙個事務,它總是返回ok。 multi 執行之後, 客戶端可以繼續向伺服器傳送任意多條命令, 這些命令不會立即被執行, 而是被放到乙個佇列中, 當 exec命令被呼叫時, 所有佇列中的命令才會被執行。

另一方面, 通過呼叫 discard , 客戶端可以清空事務佇列, 並放棄執行事務。

watch

使得 exec

命令需要有條件地執行: 事務只能在所有被監視鍵都沒有被修改的前提下執行, 如果這個前提不能滿足的話,事務就不會被執行。

watch

命令可以被呼叫多次。 對鍵的監視從 

watch

執行之後開始生效, 直到呼叫 

exec

為止。使用者還可以在單個 

watch

命令中監視任意多個鍵。

當 exec

被呼叫時, 不管事務是否成功執行, 對所有鍵的監視都會被取消。

另外, 當客戶端斷開連線時, 該客戶端對鍵的監視也會被取消。

使用無引數的 

unwatch

命令可以手動取消對所有鍵的監視。 對於一些需要改動多個鍵的事務, 有時候程式需要同時對多個鍵進行加鎖, 然後檢查這些鍵的當前值是否符合程式的要求。 當值達不到要求時, 就可以使用 

unwatch

命令來取消目前對鍵的監視, 中途放棄這個事務, 並等待事務的下次嘗試。

redis與 mysql事務的對比

mysql

redis

開啟             

start transaction           

muitl 語句

普通sql

普通命令 失敗

rollback 回滾

discard 取消                  成功

commit

exec

注: rollback與discard 的區別

如果已經成功執行了2條語句, 第3條語句出錯.

rollback後,前2條的語句影響消失.

discard只是結束本次事務,前2條語句造成的影響仍然還在 注:

在mutil後面的語句中, 語句出錯可能有2種情況

1: 語法就有問題,

這種,exec時,報錯, 所有語句得不到執行

2: 語法本身沒錯,但適用物件有問題. 比如 zadd 操作list物件

exec之後,會執行正確的語句,並跳過有不適當的語句.

(如果zadd操作list這種事怎麼避免? 這一點,由程式設計師負責) 思考

:我正在買票

ticket -1 , money -100

而票只有1張, 如果在我multi之後,和exec之前, 票被別人買了---即ticket變成0了.

我該如何觀察這種情景,並不再提交

悲觀的想法:

世界充滿危險,肯定有人和我搶, 給 ticket上鎖, 只有我能操作. [悲觀鎖]

樂觀的想法:

沒有那麼多人和我搶,因此,我只需要注意,

--有沒有人更改ticket的值就可以了 [樂觀鎖]

redis

的事務中

,啟用的是樂觀鎖

,只負責監測

key有

沒有被改動

.具體的命令----  watch命令

例: redis 127.0.0.1:6379> watch ticket ok

redis 127.0.0.1:6379> multi ok

redis 127.0.0.1:6379> decr ticket

queued

redis 127.0.0.1:6379> decrby money 100

queued

redis 127.0.0.1:6379> exec

(nil)  // 返回nil,說明監視的ticket已經改變了,事務就取消了.

redis 127.0.0.1:6379> get ticket

"0"redis 127.0.0.1:6379> get money

"200"

watch key1 key2  ... keyn

作用:監聽key1 key2..keyn有沒有變化,如果有變, 則事務取消

unwatch

作用: 取消所有watch監聽

Redis事務操作

事務有以下特性 原子性 atomicity 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。一致性 consistency 一致性是指事務必須使資料庫從乙個...

Redis事務操作

redis是乙個開源 bsd許可 記憶體儲存的資料結構伺服器,可用作資料庫,快取記憶體和訊息佇列 它支援字串 雜湊表 列表 集合 有序集合,位圖,hyperloglogs等資料型別。內建複製 lua指令碼 lru收回 事務以及不同級別磁碟持久化功能,同時通過redis sentinel提供高可用,通...

Redis基本事務操作

redis事務本質 一組命令的集合!乙個事務中的所有命令都會被序列化,在事務直線過程中,會按照順序執行!redis事務沒有隔離級別的概念所有的命令在事務中,並沒有直接被執行!只有發起執行命令的時候才會執行!exec redis單條命令式儲存原子性的,但是事務不保證原子性!redis的事務 開啟事務 ...