redis 提供的事務機制與傳統的資料庫事務有些不同,傳統資料庫事務必須維護以下特性:原子性(atomicity), 一致性(consistency),隔離性(isolation),永續性(durability),簡稱acid。
redis支援簡單的事務,將執行命令放入佇列快取,程式中有異常,執行discard回滾,其實只是取消佇列命令的執行。但執行exec時,已經執行的命令,是無法回滾的。
但是redis 的應用場景明顯不是為了資料儲存的高可靠而設計的,而是為了資料訪問的高效能而設計,設計者為了簡單性和高效能而部分放棄了原子性。
redis的事務中,啟用的是樂觀鎖,使用watch命令負責監控key有沒有被改動過,在事務中,如果任意乙個監控的key有改變,則事務取消。
redis與 mysql事務的對比:
mysql
redis
開啟事務
start transaction
multi
執行語句
普通sql (建表語句會立即執行)
普通redis命令
失敗rollback 回滾
discard 取消
成功commit
exec
1、模擬乙個redis事務操作過程
批量操作在傳送 exec 命令前被放入佇列快取,收到 exec 命令後進入事務執行
2、在mutil後面的語句中,語句出錯可能有2種情況:
① 語法有問題,在exec時會報錯, 所有語句得不到執行。
② 語法本身沒錯,但命令適用物件有問題,exec之後,會執行正確的語句,並跳過有不適當的語句。這裡其實就沒有真正意義上的回滾事務,這種情況只能是開發者自己避免。
3、discard 取消事務,清空佇列即可,比較簡單。
4、redis中的樂觀鎖
準備兩個客戶端,模擬搶票,這裡設定只有一張票:
zhang客戶端,準備買票,正在事務中,還沒執行最終的命令:
而此時,wang這邊已經把票買走了,票剩下0張
再看張這邊,執行命令後,票數卻剩下-1張了,這是不科學的。
所以,為了避免上面這種情況,redis中使用樂觀鎖來監控key有沒有被改動
同樣,zhang這邊準備好執行命令,但在開始事務前使用watch監控ticket的變動:
之後,王這邊買票成功,票剩餘0張:
zhang這邊再執行命令:
返回nil,說明票已被改動過,事務就取消了。
使用unwatch命令取消所有watch監聽
發布者和訂閱者都是redis客戶端,channel則為redis伺服器端,發布者將訊息傳送到某個的頻道,訂閱了這個頻道的訂閱者就能接收到這條訊息,客戶端可以訂閱任意數量的頻道
訂閱者訂閱頻道後,只能接收到之後發布者發布的訊息
訂閱後,發布者再發布訊息,可以看到有乙個客戶端接收到訊息了
訂閱所有redis頻道
可以看到接收到匹配頻道的訊息
**:
詳談 Redis事務和訊息訂閱
可以一次執行多個命令,本質是一組命令的集合。乙個事務中的 所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。事務能做的事 乙個佇列中,一次性 順序性 排他性的執行一系列命令 常用命令 下面的演示說明 redis是部分支援事務的。不保證原子性。首先介紹了樂觀鎖和悲觀鎖 watch監...
Redis事務及訊息發布與訂閱
把一組資料庫運算元據庫的語句放在一起執行,保證操作的原子性。要麼同時成功要麼同時失敗。在redis的事務中,允許把一組redis命令放在一起,把命令序列化,然後一起執行,保證部分原子性。命令 作用multi 用來標記乙個事務的開始,將執行的一組命令放到佇列中。exec 用來執行事務 discard ...
redis伺服器命令 訊息訂閱 事務
伺服器命令 ping 測試連線是否存活 echo 在命令列列印一些內容 select 選擇資料庫,redis資料庫編號從0 15,可以選擇任意乙個資料庫來進行資料的訪問 quit 退出連線 dbsize 返回當前資料庫中key的數目 info 獲取伺服器的資訊和統計 flushdb 刪除當前選擇資料...