傳遞任務的佇列.與任務佇列進行互動的實體有兩類,一類是生產者,一類是消費者.
生產者將需要處理的任務放入任務佇列中,二消費者不斷從任務佇列中讀入任務
資訊並執行.
優點:松耦合
生產者和消費者無需知道彼此實現的細節
易於擴充套件
消費者可以有多個,而且可以分布在不同伺服器
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...