首頁 > 軟體

Redis實現事物以及鎖的方法

2022-07-27 14:03:04

一、什麼是Redis事物

Redis事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他使用者端傳送來的命令請求所打斷。

作用:串聯多個命令防止別的命令插隊。

二、Redis 事務命令

下表列出了 redis 事務的相關命令:

注意:加入事務的命令暫時進入到任務佇列中,並沒有立即執行,只有執行exec命令才開始執行

三、命令列演示

演示事物的開始、執行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set name cabbage
QUEUED
127.0.0.1:6379(TX)> set age 20
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
127.0.0.1:6379> keys * 
1) "name"
2) "age"

演示事物的開始與取消:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set name cabbage
QUEUED
127.0.0.1:6379(TX)> set age 20
QUEUED
127.0.0.1:6379(TX)> DISCARD
OK
127.0.0.1:6379> keys *
(empty array)

演示事物的watch:

四、事物注意事項

指命令書寫格式有誤時,整體事務中所有命令均不會執行,包括那些語法正確的命令

指命令格式正確,但是無法正確的執行時,能夠正確執行的命令會執行,執行錯誤的命令不會被執行且對應的資料不會實現回滾。

五、事務三特性

單獨的隔離操作
事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他使用者端傳送來的命令請求所打斷。

沒有隔離級別的概念
佇列中的命令沒有提交之前都不會實際被執行,因為事務提交前任何指令都不會被實際執行

不保證原子性
事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾

六、分散式鎖

業務分析:雖然redis是單執行緒的,但是多個使用者端對同一資料同時進行操作時,如何避免不被同時修改?

解決方案:使用 expire 為鎖key新增時間限定,到時不釋放,則放棄鎖

命令列演示:

127.0.0.1:6379> set name cabbage
OK
127.0.0.1:6379> setnx lock_time 1
(integer) 1
127.0.0.1:6379> EXPIRE lock_time 20
(integer) 1
127.0.0.1:6379> get name 
"cabbage"

通過這種方式,即使某個使用者端由於某種原因沒有手動釋放鎖,也不會造成死鎖。因為設定了鎖lock_time的有效時間為20秒,當20秒過後,其它的使用者端就可以拿到鎖、實施業務操作、釋放鎖了。

到此這篇關於Redis實現事物以及鎖的方法的文章就介紹到這了,更多相關Redis 事物及鎖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com