Redis自學筆記 4 4高階 訊息通知

2022-01-20 05:18:55 字數 4145 閱讀 4750

傳遞任務的佇列.與任務佇列進行互動的實體有兩類,一類是生產者,一類是消費者.

生產者將需要處理的任務放入任務佇列中,二消費者不斷從任務佇列中讀入任務

資訊並執行.

優點:松耦合

生產者和消費者無需知道彼此實現的細節

易於擴充套件

消費者可以有多個,而且可以分布在不同伺服器

3.4.2節中的lpush和rpop|lpop命令可以實現佇列概念,偽**:

# 無線迴圈讀取任務佇列的內容

loop

$task = rpop queue

if $task

# 如果任務佇列中有任務則執行

execute

else

# 如果沒有則等待1秒避免頻繁請求資料

wait 1 second

缺點:當任務佇列中沒有任務時,消費者美妙都會呼叫一次rpop

brpop|blpop命令和rpop|lpop命令相似,唯一區別是當列表沒有元素時

brpop|blpop命令會一直阻塞住連線,直到新元素加入.偽**如下:

loop

# 如果佇列中沒有新任務,brpop命令會一直阻塞

$task = brpop queue,0

#返回值是乙個陣列,陣列第二個元素使我們需要的任務

execute($task[1])

brpop|blpop命令接收兩個引數,第乙個是鍵名,第二個是超時間,單位是秒.

當超時了沒有獲得新元素就會返回nil.當獲得第乙個元素後brpop|blpop

命令就會返回兩個值,分別是鍵名和元素值.

客戶端1:

127.0.0.1:6379> lpush lfoo 1 2

2127.0.0.1:6379> brpop lfoo 0

lfoo

1127.0.0.1:6379> brpop lfoo 0

lfoo

2127.0.0.1:6379> brpop lfoo 0

lfoo

新開客戶的0

(61.54s)

客戶端2:

127.0.0.1:6379> lpush lfoo 新開客戶的0

1

brpop|blpop命令可以同時接收多個鍵,其完整的命令格式為

blpop|blpop key [key ...] timeout

blpop queue:1 queue:2 0

意義是同時檢測多個鍵.如果所有鍵都沒有元素則阻塞.如果其中乙個鍵有元素則會

從該鍵中彈出元素.

如果多個鍵都有元素則從左到右的順序取鍵中的第乙個元素.

127.0.0.1:6379> lpush lfoo lfoo_1 lfoo_2

2127.0.0.1:6379> lpush lbar lbar_1 lbar_2

2127.0.0.1:6379> brpop lfoo lbar 0

lfoo

lfoo_1

127.0.0.1:6379> brpop lfoo lbar 0

lfoo

lfoo_2

127.0.0.1:6379> brpop lfoo lbar 0

lbar

lbar_1

127.0.0.1:6379> brpop lfoo lbar 0

lbar

lbar_2

藉此特性可以實現區分優先順序的任務佇列.我們分別使用queue:confirmation.email

和queue:notification.email兩個鍵儲存傳送確認郵件和通知郵件兩種任務,

然後消費者的**為:

loop

$task =

brpop queue:confirmation.email,

queue:notification.email,

0execute($task[1])

這樣一旦傳送郵件的任務被加入到que:confirmation.email佇列中,無論

queue:notification.email還有多少任務,消費者都會優先完成傳送確認郵件

的任務該模式中包含兩種角色,分別是發布者和訂閱者.訂閱者可以訂閱乙個或多個頻道,而發

步者可以向指定的頻道傳送訊息,所有訂閱此頻道的訂閱者都會收到此訊息.

發布者發布訊息的命令是 publish,用法是

publish channel message

客戶端1:

127.0.0.1:6379> subscribe channel_1 channel_2

subscribe

channel_1

1subscribe

channel_2

2message

channel_1

早上好message

channel_2

中午好

客戶端2:

127.0.0.1:6379> publish channel_1 早上好

1127.0.0.1:6379> publish channel_2 中午好

1

進入訂閱狀態後客戶端可能收到3中型別回覆:

subscriba.表示訂閱成功的反饋資訊.第二個值是訂閱成功的頻道名稱,

第三個值是當前客戶端訂閱頻道數量.

message.表示接收到道的訊息.第二個值表示產生訊息的頻道名稱.第三

個值是訊息內容.

unsubscriba.表示成功取消訂閱某個頻道.第二個值是對應的頻道名稱,

第三個值是當前客戶端訂閱的頻道數量,當此值為0時客戶端會退出訂閱

狀態,之後就可以執行其他非"發布/訂閱"模式的命令了.

psubscribe命令訂閱指定的規則.規則支援glob風格萬用字元格式(3.1節).

客戶端1:

127.0.0.1:6379> psubscribe channel_?*

psubscribe

channel_?*

1pmessage

channel_?*

channel_1

早上好pmessage

channel_?*

channel_2

中午好pmessage

channel_?*

channel_3

下午好

客戶端2:

127.0.0.1:6379> publish channel_1 早上好

1127.0.0.1:6379> publish channel_2 中午好

1127.0.0.1:6379> publish channel_3 下午好

1

遠端客戶端和redis服務端使用tcp協議連線.

redis的底層通訊協議對管道提供了支援.通過管道可以一次性傳送多條命令並在執行

完後一次性將結果返回,當一組命令中每條命令都不依賴於之前命令的執行結果時,

就可以將這組命令一起通過管道發出.管道通過減少客戶端與redis的通訊次數來

實現降低往返時延累計值的目的.

精簡鍵名和鍵值是最直觀的減少記憶體占用的方式.

redis為每種資料提供了兩種內部編碼方式.

檢視乙個鍵的內部編碼方式:object encoding key

127.0.0.1:6379> object encoding book

ziplist

表4-2每個資料型別可能採用兩種內部編碼方式之一來儲存

資料型別

內部編碼方式

object encoding命令結果

字串redis_encoding_raw

raw雜湊型別 | redis_encoding_ht | hashtable

列表型別 | redis_encoding_linkedlist | linkedlist

集合型別 | redis_encoding_ht | hashtable

Redis自學筆記 4 2高階 過期時間

在redis中使用 expire 命令設定乙個鍵的過期時間後redis會自動刪除它.expire key seconds seconds單位是秒,必須是整數 檢視見還有多久被刪除 ttl key 取消鍵的過期事件設定 persist key 為該鍵重新賦值也會清除鍵的過期時間 pexpire key...

Redis 自學筆記1

開啟firefox瀏覽器搜尋redis官網或中文官網 英文官網最新穩定版是5.0.8,中文的最新穩定版是5,0,5 注 也可以用命令 wget 二 安裝redis 2 解壓redis檔案 注 可用table自動補全目錄 解壓出多個資料夾 資料夾裡面包含對應的類檔案 配置檔案和一些命令檔案 5 編譯r...

Redis自學筆記 1 簡介

博主教材 李子驊.人民郵電出版社.redis入門指南 博主作業系統系統 虛擬機器ubuntu16.04 博主redis版本 3.0.6 redis是乙個開源的 高效能的 基於鍵值對快取的與儲存系統,通過提供多種鍵值資料型別來適應不同場景下的快取與儲存需求.使用redis情況 國外 github,st...