redis和mysql一樣,也支援簡單的事物,並且redis還可以對key進行加鎖,防止同時對某一key操作而導致資料錯誤
一、 redis與mysql事物比較:
mysql
redis
開啟語句
start transaction
muitl
事物語句
普通sql
普通redis命令
執行失敗
rollback 回滾
discard 取消
執行成功
commit
exec
二、 redis事物模擬:
1、 正確執行的事物
127.0.0.1:6379> set ticket 10#設定初始值
ok
127.0.0.1:6379> set money 500
#設定初始值
ok127.0.0.1:6379>
multi
#事物開始
ok127.0.0.1:6379> decr ticket
#命令操作,ticket減1
queued
# 加入佇列
127.0.0.1:6379> decrby money 100
#命令操作,money減100
queued
# 加入佇列
127.0.0.1:6379>
exec
# 執行事物,保證原子性
1) (integer) 9
2) (integer) 400
2、 事物執行過程中,若語句出現語法錯誤,則事物操作失敗
127.0.0.1:6379> mget ticket money3、1) "9"
2) "400"
127.0.0.1:6379> multi
ok127.0.0.1:6379> decr ticket
queued
127.0.0.1:6379> wrong-conmmand
# 錯誤的命令
(error) err unknown command 'wrong-conmmand'
127.0.0.1:6379> decrby money 100
queued
127.0.0.1:6379> exec
(error) execabort transaction discarded because of previous errors.
# 事物取消
127.0.0.1:6379> mget ticket money
1) "9"
# 結果不變
2) "400"
如果事物中的語句沒有語法錯誤,但是有不適當的語句,比如與事物不相關的語句,exec之後,會執行正確的語句,並跳過有不適當的語句.
127.0.0.1:6379> multiok127.0.0.1:6379> decr ticket
queued
127.0.0.1:6379> lpush tmp_list 123
# 語法沒有錯
queued
# 正常加入佇列
127.0.0.1:6379> exec
1) (integer) 8
2) (integer) 1
127.0.0.1:6379> mget ticket money
1) "8"
# 執行後對原有結果有影響
2) "400"
三、redis的事物鎖機制
當redis事物語句中操作了乙個key的值,在exec之前,如果有其他原因導致該key的值改變就會引起資料不同步或其他錯誤(如秒殺導致商品數量為負數),對於這種問題,redis提供了鎖機制(watch),redis事物中啟用的是樂觀鎖,只負責檢測key的值有沒有被改動
redis 127.0.0.1:6379> watch ticket# 對ticket進行監控
okredis 127.0.0.1:6379> multi
okredis 127.0.0.1:6379> decr ticket
queued
redis 127.0.0.1:6379> decrby money 100
queued
redis 127.0.0.1:6379> exec
# 執行前我們啟動了另乙個終端,並且改變了ticket的值
(nil)
# 返回nil,說明監視的ticket已經改變了,事務就取消了.
redis學習筆記三 redis命令的執行過程
redis 是單執行緒應用,它是如何與多個客戶端簡歷網路鏈結並處理命令的?由於 redis 是基於 i o 多路復用技術,為了能夠處理多個客戶端的請求,redis 在本地為每乙個鏈結到 redis 伺服器的客戶端建立了乙個 redisclient 的資料結構,這個資料結構包含了每個客戶端各自的狀態和...
Redis學習筆記(三) pipeline
redis客戶端執行一條命令分4個過程 傳送命令 命令排隊 命令執行 返回結果這個過程稱為round trip time 簡稱rtt,往返時間 mgetmset有效節約了rtt,但大部分命令 如hgetall,並沒有mhgetall 不支援批量操作,需要消耗n次rtt,這個時候需要pipeline來...
redis學習筆記三(set)
sadd keyname value 向set存入值 smembers keyname 查詢set的所有值 sismember keyname value 查詢指定的值是否存在 127.0.0.1 6379 sadd myset v1 integer 1 127.0.0.1 6379 sadd my...