Redis學習筆記 Redis事務

2021-10-02 21:10:54 字數 4550 閱讀 7631

redis事務可以一次執行多個命令(按順序地序列執行,執行中不會被其他命令插入,不許加塞)

1.簡介

redis事務可以一次執行多個命令(允許在一次單獨的步驟中執行一組命令)。

特徵:[1]批量操作在傳送exec命令前被放入佇列快取

[2]收到exec命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行

[3]在事務執行過程中,其他客戶端提交的命令請求不會被插入到事務執行命令序列中

因此redis事務有如下保證:

[1]redis會將乙個事務中的所有命令序列化,然後順序執行

[2]執行中不會被其他命令插入,不許出現加塞行為

2.事務的處理的階段與錯誤處理機制

[1] 三個階段:

開始事務

命令入隊

執行事務

[2]錯誤處理機制:

佇列中的某個命令出現報告錯誤(即不存在的命令),執行時整個的所有佇列都會被取消。

3.相關命令

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

exec # 執行所有事務塊內的命令

multi # 標記乙個事務的開始

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

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

4.相關示例

[1] multi 和 exec

需求: 轉賬功能, a向b賬號轉賬50元

這是乙個事務的例子,它先以multi 開啟乙個事務,然後多個命令入隊到事務中,最後由exec命令觸發事務

**示例:

127.0.0.1:6379[1]> set account:a 80

ok127.0.0.1:6379[1]> set account:b 10

ok127.0.0.1:6379[1]> multi

ok127.0.0.1:6379[1]> get account:a

queued

127.0.0.1:6379[1]> get account:b

queued

127.0.0.1:6379[1]> decrby account:a 50

queued

127.0.0.1:6379[1]> incrby account:b 50

queued

127.0.0.1:6379[1]> exec

1) "80"

2) "10"

3) (integer) 30

4) (integer) 60

127.0.0.1:6379[1]> get account:a

"30"

127.0.0.1:6379[1]> get account:b

"60"

解析說明:

1] 輸入multi命令開始,輸入的命令都會依次進入命令佇列中,但不會執行

2] 直到輸入exec後,redis會將之前佇列中的命令依次執行。

[2] discard 放棄佇列執行

解析說明:

1] 輸入multi 命令開始,輸入的命令都會依次進入命令佇列中,但不會執行

2] 直到輸入exec 後, redis會將之前的命令對列中的命令依次執行

3] 命令佇列的過程中可以通過discard來放棄佇列執行。

[3] 事務的錯誤處理

1) 事務的錯誤處理:

如果執行的某個命令報出了錯誤(非不存在的命令),則只有報錯的命令不會被執行,而其他的命令都會執行,

不會回滾。

**示例:

127.0.0.1:6379[1]> multi

ok127.0.0.1:6379[1]> set hello hello

queued

127.0.0.1:6379[1]> incr hello #錯誤的命令

queued

127.0.0.1:6379[1]> get hello

queued

127.0.0.1:6379[1]> exec

1) ok

2) (error) err value is not an integer or out of range

3) "hello"

2) 事務的錯誤處理:

佇列中的某個命令出現了報告錯誤不存在的命令),執行時整個的所有佇列都會被取消

**示例:

127.0.0.1:6379[1]> multi

ok127.0.0.1:6379[1]> set a 111

queued

127.0.0.1:6379[1]> abc # 命令出現報告錯誤

(error) err unknown command 'abc'

127.0.0.1:6379[1]> get a

queued

127.0.0.1:6379[1]> exec

(error) execabort transaction discarded because of previous errors.

[4] 事務的watch

watch key[key…]

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

需求:某一賬戶在一事務內進行操作,在提交事務前,另乙個程序對該賬戶進行操作

我們開啟兩個視窗(假設有兩個使用者張三和李四同時對count:b的值進行修改)

張三在進行操作前先對 count:b加了watch的操作

與此同時,李四在張三執行完 watch count:b 時,也對count:b進行了修改

張三在繼續執行自己的事務

可以看到最終事務是被終止了,且count:b為李四修改後的值

[5] unwatch

redis 中的unwatch 命令用於取消watch命令對所有key的監視

如果在執行watch 命令之後, exec命令或discard命令先執行的話,那就不需要執行unwatch了。

127.0.0.1:6379[1]> watch count:b

ok127.0.0.1:6379[1]> unwatch

ok127.0.0.1:6379[1]> incrby count:b 10 #這時對資料進行修改也不會造成事務的執行失敗

(integer) 50

127.0.0.1:6379[1]> multi

ok127.0.0.1:6379[1]> incrby count:b 10

queued

127.0.0.1:6379[1]> get count:b

queued

127.0.0.1:6379[1]> exec

1) (integer) 60

2) "60"

5.應用場景

[1] 一組命令必須同時都執行,或者都不執行

[2] 我們想要保證一組命令在執行的過程之中不被其他命令插入

[3] 商品秒殺(活動)

[4] 轉賬活動

redis 學習筆記

本文寫作源於最近產品中部分功能用到了redis redis在功能上是乙個與memecache類似的軟體,但它比memecache提供了更強大的功能。redis本質上是乙個key value型別的記憶體資料庫。其value可以是string,list,set,sorted set,hash。很多地方都...

redis學習筆記

1.redis的無序集合 sadd命令產生乙個無序集合 smembers檢視集合元素 sismember用於檢視集合是否存在,匹配項包括集合名和元素個數。匹配成功返回1,匹配失敗返回0 2.有序集合 zadd 生成乙個有序集合。zrange檢視正序的集合,zrevrange檢視反序的集合 set和g...

redis學習筆記

redis啟動伺服器和客戶端的相關命令 string型別 乙個key對應乙個value set key value 比如 set name geyule setnx 如果key存在返回0,nx表示not exist setex 指定有效期 setrange 替換 setrange key n val...