通過佇列的rpush和blpop可以實現訊息佇列,沒有任何元素可以彈出的時候,連線會被阻塞。但是基於list實現的訊息佇列,不支援一對多的訊息分發,相當於只有乙個消費者。如果要實現一對多的訊息分發就需要發布訂閱模式。
訊息的生產者和消費者是不同的客戶端,連線到同乙個redis的服務。redis的模型中是通過channel(頻道)把生產者和消費者關聯起來的。訂閱者可以訂閱乙個或者多個channel,訊息的發布者可以給指定的channel發布訊息。只要有訊息到達了channel,所有訂閱了這個channel的訂閱者都會收到這條訊息。
舉例:訂閱者訂閱頻道:可以一次訂閱多個,比如這個客戶端訂閱了3個頻道,頻道不用實現建立。
subscribe channel-1 channel-2 channel-3
發布者可以向指定頻道發布訊息(並不支援一次向多個頻道傳送訊息);
publish channel-1 fabuxiaoxile
取消訂閱
unsubscribe channel-l
按規則(pattern)訂閱頻道支援?和*佔位符。?代表乙個字元,*代表0個或者多個字元。
例如:現在有三個新聞頻道,運動新聞(news-sport)、**新聞(news-music)、天氣新聞(news-weather)。
三個消費者:
消費端1,關注運動資訊:
psubscribe *sport
消費端2,關注所有新聞:
psubscribe news*
消費端3,關注天氣新聞:
psubscribe news-weather
生產者,向3個頻道發布3條資訊,對應的訂閱者能收到訊息:
redis的單個命令是原子性的(比如get set mget mset),要麼成功要麼失敗,不存在併發干擾的問題。如果涉及到多個命令的時候,需要把多個命令作為乙個不可分割的處理序列,就必須要依賴redis的功能特性來實現了。
redis提供了事務的功能,可以把一組命令一起執行。redis的事務有3個特點:
1、按進入佇列的順序執行。
2、不會受到其他客戶端的請求的影響。
3、事務不能巢狀,多個multi命令效果一樣。
用法
redis的事務涉及到四個命令:
multi(開啟事務),
exec(執行事務),
discard(取消事務),
watch(監視)
通過multi的命令開啟事務。multi執行後,客戶端可以繼續向伺服器傳送任意多條命令,這些命令不會立即被執行,而是被放到乙個佇列中。當exec命令被呼叫時,所有佇列中的命令才會被執行。如果沒有執行exec,所有的命令都不會被執行。如果中途不想執行事務了,可以呼叫discard清空事務佇列,放棄執行。
watch(監視)
為了防止事務過程中某個key的值被其他客戶端請求修改,帶來非預期的結果,在redis中還提供了乙個watch命令。也就是多個客戶端更新變數的時候,會跟原值做比較,只有它沒有被其他執行緒修改的情況下,才更新成新的值。它可以為redis事務提供cas樂觀鎖行為。我們可以用watch監視乙個或者多個key,如果開啟事務之後,至少有乙個被監視key鍵在exec執行之前被修改了,那麼整個事務都會被取消(key提前過期除外)。可以用unwatch取消。
事務可能遇到的問題
事務執行遇到的問題分成兩種,一種是在執行exec之前發生錯誤,一種是在執行exec之後發生錯誤。
為什麼不回滾?
官方的解釋:
Redis發布訂閱模式
publish subscribe 發布訂閱模式的原理 包含兩個角色,乙個是發布者,乙個是訂閱者 訂閱者可以訂閱乙個或者多個頻道channel 發布者可以向指定頻道發布資訊 通過publish發布訊息 publish channel message publish channel1.1 maizie...
redis訂閱發布模式
理論遲點再補,先上 直接上 demopub.php 發布者 redis new redis redis connect localhost 6379 redis publish mcs 麒麟之才 demosub.php 訂閱者 redis new redis redis connect 127.0....
redis發布訂閱模式
發布 訂閱 模式包含兩種角色,分別是發布者和訂閱者。訂閱者可以訂閱乙個或者多個頻道 channel 而發布者可以向指定的頻道 channel 傳送訊息,所有訂閱此頻道的訂閱者都會收到此訊息。此模式允許生產者只生產一次訊息,由中介軟體負責將訊息複製到多個訊息佇列,每個訊息佇列由對應的消費組消費。模糊匹...