Redis學習 事務 訊息訂閱和發布

2022-08-19 10:33:08 字數 2155 閱讀 7166

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 刪除當前選擇資料...