Redis 學習筆記(八)事務

2021-10-25 02:24:37 字數 2395 閱讀 6732

更多的資料型別命令可在redis中文官網中查詢和學習,下面學習redis的事務。

原子性是指乙個操作或者多個操作,要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。

事務是指一系列操作,這些操作要麼同時成功,要麼同時失敗,它是一種原子操作。事務沒有隔離級別的概念。

redis的單條命令都具有原子性,但是不保證多條命令的原子性!

想要讓redis客戶端的多條命令可以不被其他的客戶端打斷,可以使用事務:

執行事務時,所有的命令都會被順序地一次性執行,且不會被其他客戶端打斷。但是redis事務不保證原子性,也就是不支援命令錯誤時回滾。

需要注意的是:

如果 redis 開啟 aof 模式,在執行 redis 事務之前,redis會先把事務寫在磁碟中再執行命令。如果事務執行到一半,redis程序突然就掛了,那麼就會導致事務中只有一部分指令執行成功,還有一部分指令還未執行。

這種情況下,在 redis下一次啟動時會檢測到錯誤,並退出 redis。使用 redis-check-aof 工具可以對 aof 檔案進行修復,刪除掉磁碟中的未執行成功的事務,然後重新啟動載入 aof 檔案,redis 就恢復到事務沒有執行建立的狀態,就可以正常啟動了

有關於aof持久化的內容會在後續文章中整理出來。

步驟:

1、開啟事務

multi  #開啟事務後,接下來執行每條正確的指令都返回 queue,代表命令被放入等待佇列,並不會執行
2、命令入隊

set incrby get
3、執行事務

exec         #會按順序返回事務中每條命令的返回結果,執行完事務後,事務就關閉了
當想要放棄事務時,可用命令:

discard      #取消事務,在exec執行命令之前使用
下面來進行兩組測試:

127.0.0.1:6379> flushall

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> sets sara hello # 事務中命令輸錯

(error) err unknown command

`sets`

, with args beginning with: `sara`

, `hello`

, 127.0.0.1:6379>

set sara hello

queued

127.0.0.1:6379>

exec

# 事務執行不成功

(error) execabort transaction discarded because of previous errors.

127.0.0.1:6379> flushall

ok127.0.0.1:6379>

set sara hello

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> incr sara # 由於sara中存的不是integer,在執行時會出錯

queued

127.0.0.1:6379>

set jerry world

queued

127.0.0.1:6379>

exec

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

2) ok

從這兩個測試中可以看出:

redis事務可以用於監控變數,使用 watch 命令可當做樂觀鎖來操作:

set money 100               #設定鍵值對

set cangku:wazi 20

watch money cangku:wazi #監視money和cangku:wazi,是否在監視開啟到事務執行的這段時間內發生變化

multi #開啟事務

incrby money 30 #money自增30

## 此時客戶端2對money的值進行了改變

decrby cangku:wazi 5 #倉庫襪子數量自減5

exec #執行事務,此時會發現事務中的命令將都不會被執行

如果發現事務執行失敗,則需先解鎖:

unwatch                #解鎖所有被監控的變數
然後再次獲取新值進行監控

watch money cangku:wazi

Redis學習筆記 Redis事務

redis事務可以一次執行多個命令 按順序地序列執行,執行中不會被其他命令插入,不許加塞 1.簡介 redis事務可以一次執行多個命令 允許在一次單獨的步驟中執行一組命令 特徵 1 批量操作在傳送exec命令前被放入佇列快取 2 收到exec命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然...

redis事務學習筆記

redis事務 可以一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。在提交事務提交前,每個命令將以佇列的形式入隊,直到提交事務。redis事務非關係型資料庫事務 有可能會出現部分失敗部分成功 具體看舉例說明。multi 標記乙...

redis學習筆記 事務

事務是乙個單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。事務是乙個原子操作 事務中的命令要麼全部被執行,要麼全部都不執行。注 對於redis事務是否是原子性可以參考我個人挺支援作者觀點。命令說明 multi 標記乙個事務塊的開始...