Redis事務簡介
前言
在傳統關係型資料庫中,事務有四大特性,就是所謂的ACID。具體的是四大特性這裡不再贅述。不熟悉的或者忘記的同學可以自行百度。這裡我們主要是學習下redis中事務的特點。
Redis中事務的特點
Redis事務的本質是一組命令的集合,可以一次執行多個命令,所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許插隊。將一組需要一起執行的命令放到multi和exec兩個命令之間。multi命令代表事務開始,exec命令代表事務結束,它們之間的命令是原子順序執行的
單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。
沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務裡的更新,在事務外查詢不能看到”這個讓人萬分頭痛的問題
不保證原子性:redis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾
Redis事務執行的3個階段
開啟:以MULTI開始一個事務
入隊:將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務佇列裡面
執行:由EXEC命令觸發事務
事務中的五個命令
multi命令
該命令用於標記一個事務塊的開始,事務塊內的多條命令會按照先後順序被放進一個隊列當中,最後由exec命令地執行。
基本語法:multi
返回值:總是返回OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
exec命令
用於執行素有事務塊內的命令
exec命令基本語法:exec
返回值:事務塊內所有命令的返回值,按命令執行的先後順序排列,當操作被打斷時,返回空值null。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
127.0.0.1:6379> keys *
1) "user_id"
127.0.0.1:6379> get user_id
"3"
discard命令
該命令用於取消事務,放棄執行事務塊內的所有命令。
discard命令基本語法:discard
返回值:總是返回OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> set greeting "hello"
QUEUED
127.0.0.1:6379> discard #執行discard命令,事務塊內的所有命令放棄執行
OK
127.0.0.1:6379> exec #執行discard命令後,在執行exec命令報錯
(error) ERR EXEC without MULTI
watch命令
watch命令用於監視一個(或多個)key,如果在事務執行之前這個(或這些)key被其他命令所改動,那麼事務將被打斷。
基本語法:watch key 【key...】
返回值:總是返回OK
127.0.0.1:6379> watch lock lock_times
OK
unwatch命令
命令用於取消watch命令對所有key的監視。
基本語法:UNwatch
返回值:總是返回OK
127.0.0.1:6379> watch lock lock_times
OK
127.0.0.1:6379> unwatch
OK
總結
上面簡單的介紹了Redis中事務的幾個特性,具體執行流程和命令。我們可以利用redis中的事務來實現樂觀鎖。具體請參見