若是Redis須要執行一組命令,爲了保持數據的一致性,連續性,須要用到事務(Transaction),本文以一些簡單的小例子,簡述Redis事務相關內容,僅供學習分享使用,若有不足之處,還請指正。redis
基本事務以MULTI開始,以EXEC結束,中間是一組Redis命令,以下所示:數據庫
1 127.0.0.1:6379> MULTI 2 OK 3 127.0.0.1:6379> SET NAME HSIANG 4 QUEUED 5 127.0.0.1:6379> SET AGE 20 6 QUEUED 7 127.0.0.1:6379> SET SEX MALE 8 QUEUED 9 127.0.0.1:6379> SET ADDR SHENZHEN 10 QUEUED 11 127.0.0.1:6379> EXEC 12 1) OK 13 2) OK 14 3) OK 15 4) OK 16 127.0.0.1:6379>
取消事務,則恢復數據到事務執行以前的狀態,以MULTI開始,以DISCARD結尾,以下所示:學習
1 127.0.0.1:6379> GET AGE 2 "20" 3 127.0.0.1:6379> MULTI 4 OK 5 127.0.0.1:6379> INCR AGE 6 QUEUED 7 127.0.0.1:6379> INCR AGE 8 QUEUED 9 127.0.0.1:6379> INCR AGE 10 QUEUED 11 127.0.0.1:6379> DISCARD 12 OK 13 127.0.0.1:6379> GET AGE 14 "20"
Redis事務中,若是要執行的一組命令中,沒有語法錯誤,可是有數據類型錯誤,在進行EXEC的時候,則其餘命令執行成功,錯誤數據執行失敗,即爲部分紅功。以下所示:spa
1 127.0.0.1:6379> MULTI 2 OK 3 127.0.0.1:6379> INCR AGE 4 QUEUED 5 127.0.0.1:6379> INCR ADDR 6 QUEUED 7 127.0.0.1:6379> INCR AGE 8 QUEUED 9 127.0.0.1:6379> EXEC 10 1) (integer) 21 11 2) (error) ERR value is not an integer or out of range 12 3) (integer) 22 13 127.0.0.1:6379> GET AGE 14 "22"
若是要執行的Redis命令,存在語法錯誤,則在進行EXEC的時候回滾,以下所示:code
1 127.0.0.1:6379> MULTI 2 OK 3 127.0.0.1:6379> INCR AGE 4 QUEUED 5 127.0.0.1:6379> SET ADDR 6 (error) ERR wrong number of arguments for 'set' command 7 127.0.0.1:6379> INCR AGE 8 QUEUED 9 127.0.0.1:6379> EXEC 10 (error) EXECABORT Transaction discarded because of previous errors. 11 127.0.0.1:6379> GET AGE 12 "22"
鎖分爲樂觀鎖,悲觀鎖,如下分別介紹:blog
當監控的key的值在事務以前發生變化了,則事務不被執行。只有取消監控後,事務纔會執行,以下所示:隊列
1 127.0.0.1:6379> WATCH balance 2 OK 3 127.0.0.1:6379> set balance 300 4 OK 5 127.0.0.1:6379> MULTI 6 OK 7 127.0.0.1:6379> INCRBY balance 10 8 QUEUED 9 127.0.0.1:6379> DECRBY debt 10 10 QUEUED 11 127.0.0.1:6379> EXEC 12 (nil) 13 127.0.0.1:6379> GET balance 14 "300" 15 127.0.0.1:6379> UNWATCH 16 OK
早發白帝城事務
做者:李白(唐代)ci
朝辭白帝彩雲間,千里江陵一日還。io
兩岸猿聲啼不住,輕舟已過萬重山。