更多的資料型別命令可在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 標記乙個事務塊的開始...