2 redis 慢查詢、pipeline優化、發佈訂閱、特殊類型

Redis命令的生命週期

  1. 客戶端向Redis服務器發送命令
  2. 命令請求在請求隊列中排隊等待處理
  3. 執行命令
  4. 返回命令結果

Redis慢查詢

  • 慢查詢發生在生命週期的第三階段,是指僅僅執行命令階段比較慢被稱爲慢查詢。
  • 客戶端超時不必定是慢查詢,可是慢查詢時是客戶端超時的一個可能因素。

Redis慢查詢相關配置

1. slowlog-max-len

​ 它決定了慢查詢日誌最多能保存多少條日誌,slow log自己是一個內存中的FIFO隊列,當隊列大小超過slowlog-max-len時,最舊的一條日誌將被刪除,而最新的一條日誌加入到slow log中。java

  • 默認值:128
  • 支持動態配置

2.slowlog-log-slower-than

​ 它決定要對執行時間大於多少微妙(microsecond , 1秒=1,000,000 微妙)的查詢進行記錄git

  • 默認值:10000redis

  • 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左右ide

  • 須要理解命令的生命週期性能

  • 按期持久化慢查詢google

    • 由於慢查詢只存儲於內存中,一宕機慢查詢數據就會丟失
    • 經過按期slowlog get將慢查詢數據轉存到MySQL或者ES中

pipeline的好處

  • 省略因爲單線程致使的命令排隊時間,一次命令的消耗時間=一次網絡時間 + 命令執行時間
  • 比起命令執行時間,網絡時間極可能成爲系統的瓶頸
  • pipeline的做用是將一批命令進行打包,而後發送給服務器,服務器執行完按順序打包返回。
  • 經過pipeline,一次pipeline(n條命令)=一次網絡時間 + n次命令時間
命令 N個命令操做 1次pupeline(n個命令)
時間 n次網絡+n次命令 1次網絡+n次命令
數據量 1條命令 n條命令

pipeline-Jedis使用

//沒有使用pipieline的狀況下
public void testWithoutPipeline() {
    Jedis jedis = new Jedis("127.0.0.1" , 6379);
    for(int i = 1 ; i <= 10000 ; i++ ) {
        jedis.hset("hashKey-" + i , "field-" + i , "value-" + i);
    }
}

//使用pipeline的狀況下
public void testPipeline() {
    Jedis jedis = new Jedis("127.0.0.1" , 6379);
    for(int i = 0 ; i < 100 ; i++ ) {
        Pipeline pipeline = jedis.pipelined();
        for(int j = i * 100 ; i < (i+1) * 100 ; j++ ) {
            pipeline.hset("hashKey-" + j , "field-" + j , "value-" + j);
        }
        pipeline.syncAndReturnAll();
    }
}
複製代碼

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 [channel2...]

  • 含義:訂閱給定的一個或多個渠道的消息

3.unsubcribe [channel1 [channel2...]]

  • 含義:取消訂閱給定的一個或多個渠道的消息

###4.psubscribe pattern1 [pattern2...]

  • 含義:訂閱一個或多個符合給定模式的頻道

###5.punsubscribe [pattern1 [pattern2...]]

  • 含義:退訂全部給定模式的頻道

6.pubsub channels

  • 含義:列出至少有一個訂閱者的頻道

###7.pubsub numsub [channel...]

  • 含義:列出給定頻道的訂閱者數量

發佈訂閱-Jedis

//訂閱
public void testSubscribe() {
    Jedis jedis = new Jedis("127.0.0.1" , 6379);
    jedis.subscribe(new JedisPubSub() {
        @Override
        public void onMessage(String channel, String message) {
            System.out.println("receive channel ["+channel+"] message ["+message+"]");
        }
    } , "aliTV" , "googleTV");
}

//發佈
public void testPublish() {
    Jedis jedis = new Jedis("127.0.0.1" , 6379);
    jedis.publish("aliTV" , "I am xuyinan");
    jedis.publish("googleTV" , "My age is 27");
}
複製代碼

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。

#HyperLogLog簡介

  • 基於HyperLogLog算法,使用極小空間完成獨立數量統計的功能
  • 本質仍是一個字符串
  • 十分節約內存
  • 官方給出存在0.81%的錯誤率
  • 沒法取出單條數據

HyperLogLog的相關命令

1.pfadd key element1 [element2...]

  • 含義:向HyperLogLog中添加元素

2.pfcount key1 [key2...]

  • 含義:計算HyperLogLog的獨立總數

3.pfmerge destKey key1 [key2...]

  • 含義:合併多個hyperLogLog到destKey中

GEO簡介

  • Redis 3.2添加新特性
  • 功能:存儲經緯度、計算兩地距離、範圍計算等
  • 基於ZSet實現
  • 刪除操做使用zrem

GEO相關命令

1.geoadd key longitude latitude member [lon lat member...]

  • 含義:增長地理位置信息
    • 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:將返回結果而的地理位置信息保存到指定鍵
  • storedist 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:將返回結果距離中心節點的距離保存到指定鍵
相關文章
相關標籤/搜索