【乾貨】Redis進階合集,想學的進來看看!
Redis命令的生命週期
1.客戶端把Redis指令寫入到客戶端緩衝區中
2.緩衝區滿後傳送到Redis伺服器,並先寫入服務端緩衝區
3.從緩衝區裡面拿出命令請求放置到請求佇列中排隊等待處理
4.執行命令
5.返回命令結果
Redis慢查詢
慢查詢發生在生命週期的第三階段,是指僅僅執行命令階段比較慢被稱為慢查詢
客戶端超時不-定是慢查詢,但是慢查詢時是客戶端超時的一個可能因素。
Redis慢查詢相關配置
1. slowlog-max-len
它決定了慢查詢日誌最多能儲存多少條日誌,slow log本身是一個記憶體中的FIFO佇列,當佇列大小超過slowlog-max-len時,最舊的一條日誌將被刪除,而最新的一條日誌加入到slow log中。
預設值:128
支援動態配置
2.slowlog-log-slower-than
它決定要對執行時間大於多少微妙(microsecond ,1秒= 1,000,000微妙)的查詢進行記錄
預設值: 10000
slowlog-log-slower-than= 0,記錄所有命令
slowlog-log-slower-than < 0,不記錄任何命令
支援動態配置
慢查詢相關命令
1.slowlog get [n]
含義:獲取慢查詢列表中的慢查詢資訊
n:獲取出多少條慢查詢資料資訊
2.slowlog len
含義:獲取慢查詢佇列長度
3.slowlog reset
含義:清空慢查詢佇列
慢查詢資訊欄位
1.欄位1:唯一性的日誌識別符號(Integer)
2.欄位2:被記錄命令的執行時間點,已UNIX時間戳格式表示(Integer)
3.欄位3:查詢執行時間,以微秒為單位
4.欄位4:完整的執行命令
慢查詢運維經驗
slowlog-log-slower-than不要設定過大,預設10ms,通常設定1ms。
因為Redis的qps是萬級別的,即每秒應能執行10000次請求當一條命令執 行1ms時,那每秒只能執行1000次請求 slowlog-max-len 不要設 置地過小,通常設定1000左右需要理解命令的生命週期定期持久化慢查詢。
因為慢查詢只儲存於記憶體中,宕機慢查詢資料就會丟失通過定期slowlog get將慢查詢資料轉存到MySQL或者ES中
pipeline的好處
省略由於單執行緒導致的命令排隊時間,一次命令的消耗時間 = 一次網路時間+命令執行時間。比起命令執行時間,網路時間很可能成為系統的瓶頸。
pipeline的作用是將一批命令進行打包,然後傳送給伺服器,伺服器執行完按順序打包返回。通過pipeline, 一次pipeline (n條命令) = 一次網路時間+ n次命令時間
pipeline VS M操作(mget、mset)
M操作在Redis佇列中是一個原子操作,pipeline不是原子操作
pipeline 與M操作都會將資料順序的傳送與順序地返回
pipeline注意事項
每次pipeline攜帶數量不推薦過大, 否則會影響網路效能
pipeline每次只能作用在一個Redis節點 上
釋出訂閱的角色與通訊模型
1.角色
釋出者(publisher)
訂閱者(subscriber)
頻道(channel)
2.通訊模型
RedisServer中可以建立若channel,一個訂閱者可以訂閱多個channel
當釋出者向一個頻道中釋出一條訊息時,所有的訂閱者都將會收到訊息
Redis的釋出訂閱模型沒有訊息積壓功能,即新加入的訂閱者收不到釋出者之前釋出的訊息
當訂閱者收到訊息時,訊息內容如下
第一行: 固定內容message
第二行: channel的名稱
第三行: 收到的新訊息
釋出訂閱的API
1.publish channel message
含義:向指定的channel中釋出訊息
2.subscribe channel1 [channel...]
含義:訂閱給定的一個或多個渠道的訊息
3.unsubcribe [channel1 [chane2..]
含義:取消訂閱給定的一個或多個渠道的訊息
###4.psubscribe pattern1 [pattern2..]
含義:訂閱一個或多個符合給定模式的頻道
###5.punsubscribe [pattern1 [patern..]
含義:退訂所有給定模式的頻道
6.pubsub channels
含義:列出至少有一個訂閱者的頻道
###7.pubsub numsub [hannel.]
含義:列出給定頻道的訂閱者數量
BitMap的API
1.getbit key offset
含義:對key所儲存的字串值, 獲取指定偏移量上的位(bit)
2.setbit key offset value
含義:對key所儲存的字串值,設定或清除指定偏移量上的位(bit)
返回值為該位在setbit之前的值
value只能取0或1
offset從0開始, 即使原點陣圖只能10位,offset可以取1000
3.bitcount key [start end]
含義:獲取點陣圖指定範圍中位值為1的個數
如果不指定start與end,則取所有
4.bitop op destKey key1 [key2..]
含義:做多個BitMap的and (交集) 、or (並集)、not (非)、xor (異或)操作並將結果儲存在destKey中
5.bitpos key tartgetBit [start end]
含義:計算點陣圖指定範圍第一 個偏移量對應的的值等於targetBit的位置
找不到返回-1
start與end沒有設定, 則取全部
targetBit只能取0或者1
BitMap的使用場景
統計每日使用者的登入數。每一位標識一個使用者ID,當某個使用者訪問我們的網頁或執行了某個操作,就在bitmap中把標識此使用者的位設定為1。
#HyperLogL og簡介
基於HyperLogLog演算法, 使用極小空間完成獨立數統計的功能
本質還是一個字串
十分節約記憶體
官方給出存在0.81%的錯誤率
無法取出單條資料
HyperLogL og的相關命令
1.pfadd key element1 [element2..]
含義:向HyperLogLog中新增元素
2.pfcount key1 [key2..]
含義:計算HyperLogLog的獨立總數
3.pfmerge destKey key1 [key2..]j
含義:合併多個hyperLogLog到destKey中
GEO簡介
Redis 3.2新增新特性
功能:儲存經緯度、計算兩地距離、範圍計算等
基於ZSet實現
刪除操作使用zrem
GEO相關命令
1.geoadd key longitude latitude member [lon latmember..]
含義:增加地理位置資訊
longitude :經度
latitude :緯度
member :標識資訊
2.geopos key member1 [member2...]
含義:獲取地理位置資訊
###3.geodist key member1 member2 [unit]
含義:獲取兩個地理位置的距離
unit取值範圍
m(米,預設)
km (千米)
mi (英里)
ft (英尺)
###4.georadius key longitude latitude unit [withcoord] [withdist] [withhash] [COUNT count] [sort] [store key] [storedist key]
含義:以給定的經緯度為中心,返回包含的位置元素當中,與中心距離不超過給定最大距離的所有位置元素。
unit取值範圍
m(米)
km (千米)
mi (英里)
ft(英尺)
withcoord: 將位骯素的經度與緯度也一併返回
withdist: 在返回位置元素的同時,將距離也-並返回。距離的單位和使用者給定的範圍單位保持-致
withhash: 以52位的符號整數形式,返回位置元素經過geohash編碼的有序集合分值。用於底層應用或除錯,實際作用不大。
sort取值範圍
asc: 根據中心位置, 按照從近到遠的方式返回位置元素
desc:根據中心位置, 按照從遠到近的方式返回位置元素
store key:將返回結果而的地理位置資訊儲存到指定鍵
5.georadiusbymember key member radius unit [withcoord] [withdist][withhash][COUNT count][sort][store key] [storedist key]
含義:以給定的元素為中心,返回包含的位置元素當中,與中心距離不超過給定最大距離的所有位置元素。
unit取值範圍
m(米)
km (千米)
mi (英里)
ft (英尺)
withcoord: 將位置元素的經度與緯度也一併返回
withdist: 在返回位置元素的同時,將距離也一併返回。距離的單位和使用者給定的範圍單位保持一致
withhash: 以52位的符號整數形式,返回位置元素經過geohash編碼的有序集合分值。用更於底層應用或除錯,實際作用不大。
sort取值範圍
asc: 根據中心位置,按照從近到遠的方式返回位置元素
desc: 根據中心位置, 按照從遠到近的方式返回位置元素
store key:將返回結果而的地理位置資訊儲存到指定鍵
storedist key:將返回結果距離中心節點的距離儲存到指定鍵