Redis學習筆記三 redis事物及鎖的應用

2021-07-15 06:29:31 字數 2371 閱讀 7438

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 money

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"

3、

如果事物中的語句沒有語法錯誤,但是有不適當的語句,比如與事物不相關的語句,exec之後,會執行正確的語句,並跳過有不適當的語句.

127.0.0.1:6379> multi

ok127.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...