Redis瑞士軍刀:慢查詢,Pipeline和發布訂閱

來源:互聯網
上載者:User

標籤:記憶體   網路   功能   127.0.0.1   方式   ash   需要   資料   能力   

1.慢查詢1.1 慢查詢的生命週期
步驟一:client通過網路向Redis發送一條命令步驟二:由於Redis是單線程應用,可以把Redis想像成一個隊列,client執行的所有命令都在排隊等著server端執行步驟三:Redis服務端按順序執行命令步驟四:server端把命令結果通過網路返回給client

說明:

慢查詢發生在命令執行過程中,不包含網路延遲時間及排除等待執行的時間用戶端逾時不一定慢查詢,但慢查詢是用戶端逾時的一個可能因素    
1.2 慢查詢的配置項
slowlog-max-len             慢查詢隊列的長度slowlog-log-slower-than     慢查詢閾值(單位:微秒),執行時間超過閥值的命令會被加入慢查詢命令    如果設定為0,則會記錄所有命令,通常在需要記錄每條命令的執行時間時使用    如果設定為小於0,則不記錄任何命令slowlog list                慢查詢記錄

說明:

慢查詢是一個先進先出的隊列,如果一條命令在執行過程中被列入慢查詢範圍內,就會被放入一個隊列,這個隊列是基於Redis的列表來實現,而且這個隊列是固定長度的,當隊列的長度達到固定長度時,最先被放入隊列就會被pop出去慢查詢隊列儲存在記憶體之中,不會做持久化,當Redis重啟之後就會消失    
1.3 慢查詢配置方法1.3.1 修改設定檔重啟
修改/etc/redis.conf設定檔,配置慢查詢修改配置方式應該在第一次配置Redis中時配置完成,生產後不建議修改設定檔
1.3.2 動態配置
127.0.0.1:6379> config get slowlog-max-len1) "slowlog-max-len"2) "128"127.0.0.1:6379> config get slowlog-log-slower-than1) "slowlog-log-slower-than"2) "10000"127.0.0.1:6379> config set slowlog-max-len 1000OK127.0.0.1:6379> config get slowlog-max-len1) "slowlog-max-len"2) "1000"127.0.0.1:6379> config set slowlog-log-slower-than 1000OK127.0.0.1:6379> config get slowlog-log-slower-than1) "slowlog-log-slower-than"2) "1000"
1.4 慢查詢命令
slowlog get [n]         擷取慢查詢隊列slowlog len             擷取慢查詢隊列長度slowlog reset           清空慢查詢隊列
1.5 Redis慢查詢營運經驗
slowlog-max-len不要設定過小,通常設定1000左右slowlog-log-slower-than不要設定過大,預設10ms,通常設定1ms理解命令生命週期可以通過slowlog get等命令定期將慢查詢命令持久化到其他資料來源,這樣就可以查到很多曆史的慢查詢操作命令在生產環境中,不管slowlog-max-len設定多大,當慢查詢命令逐步增多時,最開始的慢查詢命令會被丟掉當需要查詢曆史資料時,這些慢查詢命令都是非常關鍵的可以使用開源軟體來實現這些功能,對於分析解決Redis問題是非常有協助的
2.Pipeline2.1 Pipeline的概念

一次網路命令通訊模型:

client通過網路傳輸命令到server端server端通過計算得到命令執行結果server端把命令執行結果給client    

此時:

一次網路命令通訊時間=1次網路時間 + 1次命令時間

此時如果有多條命令呢,那就只能一條一條的輸入命令執行了

n次時間 = n次網路時間 + n次命令時間

Redis執行命令的時間很快,但是網路傳輸卻可能有很大延遲,

pipeline就是把一批命令進行打包,然後傳輸給server端進行批次運算,然後按順序將執行結果返回給client端

使用Pipeline模型進行n次網路通訊需要的時間

1次pipeline(n條命令) = 1次網路時間 + n次命令時間
2.2 例子
import redisimport timeclient = redis.StrictRedis(host=‘192.168.81.100‘,port=6379)start_time = time.time()for i in range(10000):    client.hset(‘hashkey‘,‘field%d‘ % i,‘value%d‘ % i)ctime = time.time()print(client.hlen(‘hashkey‘))print(ctime - start_time)

程式執行結果:

100002.0011684894561768

在上面的例子裡,直接向Redis中寫入10000條hash記錄,需要的時間為2.00秒

使用pipeline的方式向Redis中寫入1萬條hash記錄

import redisimport timeclient = redis.StrictRedis(host=‘192.168.81.100‘,port=6379)start_time = time.time()for i in range(100):    pipeline = client.pipeline()    j = i * 100    while j < (i+ 1) * 100:        pipeline.hset(‘hashkey1‘,‘field%d‘ % j * 100,‘value%d‘ % i)        j += 1    pipeline.execute()ctime = time.time()print(client.hlen(‘hashkey1‘))print(ctime - start_time)

程式執行結果:

100000.3175079822540283

可以看到使用Pipeline方式每次向Redis服務端發送100條命令,發送100次所需要的時間僅為0.31秒,可以看到使用Pipeline可以節省網路傳輸時間

2.3 Pipeline使用建議
首先要注意每次pipeline攜帶資料量不能太大pipeline可以提高Redis批量處理的並發的能力,但是並不能無節制的使用如果批量執行的命令數量過大,則很容易對網路及用戶端造成很大影響,此時可以把命令分割,每次發送少量的命令到服務端執行pipeline每次只能作用在一個Redis節點上
3.發布訂閱3.1 發布訂閱中的角色
發行者(publisher)訂閱者(subscriber)頻道(channel)
3.2 發布訂閱的模型
Redis server就相當於頻道發行者是一個redis-cli,通過redis server發布訊息訂閱者也是於一個redis-cli,如果訂閱了這個頻道,就可以通過redis server擷取訊息

說明:

發布訂閱就是一個生產者消費者模型每個訂閱者可以訂閱多個頻道發行者發布訊息後,訂閱者就可以收到不同頻道的訊息訂閱者不可以接收未訂閱頻道的訊息訂閱者訂閱某個頻道後,Redis無法做訊息的堆積,不能接收頻道被訂閱之前發布的訊息
3.3 發布訂閱的命令
publish channel message         發布訊息subscribe [channel]             訂閱頻道unsubscribe [channel]           取消訂閱psubscribe [pattern...]         訂閱指定模式的頻道punsubscribe [pattern...]       退訂指定模式的頻道pubsub channels                 列出至少有一個訂閱者的頻道pubsub numsub [channel...]      列表給定頻道的訂閱者數量pubsub numpat                   列表被訂閱模式的數量 

例子:

開啟一個終端1

127.0.0.1:6379> subscribe sohu_tv               # 訂閱sohu_tv頻道Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "sohu_tv"3) (integer) 1

再次開啟一個終端2

127.0.0.1:6379> publish sohu_tv ‘hello python‘      # sohu_tv頻道發布訊息(integer) 1127.0.0.1:6379> publish sohu_tv ‘hello world‘       # sohu_tv頻道發布訊息(integer) 3

可以看到終端1中已經接收到sohu_tc發布的訊息

127.0.0.1:6379> subscribe sohu_tvReading messages... (press Ctrl-C to quit)1) "subscribe"2) "sohu_tv"3) (integer) 11) "message"2) "sohu_tv"3) "hello python"1) "message"2) "sohu_tv"3) "hello world"

開啟終端3,取消訂閱sohu_tc頻道

127.0.0.1:6379> unsubscribe sohu_tv1) "unsubscribe"2) "sohu_tv"3) (integer) 0
3.4 發布訂閱與訊息佇列
redis server維護一個隊列訊息發行者,相當於一個redis-cli,通過redis server發布訊息訊息訂閱者就相當於一個redis-cli,所有的訊息訂閱者通過redis server搶訊息發行者發布的訊息

Redis瑞士軍刀:慢查詢,Pipeline和發布訂閱

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.