1. 程式人生 > >Redis事務簡介

Redis事務簡介

前言

在傳統關係型資料庫中,事務有四大特性,就是所謂的ACID。具體的是四大特性這裡不再贅述。不熟悉的或者忘記的同學可以自行百度。這裡我們主要是學習下redis中事務的特點。

Redis中事務的特點

Redis事務的本質是一組命令的集合,可以一次執行多個命令,所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許插隊。將一組需要一起執行的命令放到multiexec兩個命令之間。multi命令代表事務開始exec命令代表事務結束,它們之間的命令是原子順序執行的

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

沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務裡的更新,在事務外查詢不能看到”這個讓人萬分頭痛的問題

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

Redis事務執行的3個階段

  1. 開啟:以MULTI開始一個事務

  2. 入隊:將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務佇列裡面

  3. 執行:由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中的事務來實現樂觀鎖。具體請參見

Redis實現樂觀鎖