Redis筆記(二)Redis其餘功能

慢查詢

生命週期

clipboard.png

兩個配置

  • slowlog-max-len:慢查詢隊列長度
  • slowlog-log-slower-than:慢查詢閾值(單位:微秒)
    slowlog-log-slower-than=0, 記錄全部命令
    slowlog-log-slower-than<0, 不記錄任何命令

配置方法git

  1. 默認值redis

    • config get slowlog-max-len = 128
    • config get slowlog-log-slower-than = 10000
  2. 修改配置文件重啓
  3. 動態配置服務器

    • config set slowlog-max-len 1000
    • config set slowlog-log-slower-than 1000

三個命令

  1. slowlog get [n]:獲取慢查詢隊列
  2. slowlog len:獲取慢查詢隊列長度
  3. slowlog reset:清空慢查詢隊列

運維經驗

  1. slowlog-max-len不要設置過大,默認10ms,一般設置1ms
    Redis的QPS是萬級的,也就是一條命令平均0.1ms就執行結束了。一般咱們翻10倍,設置1ms。
  2. slowlog-log-slower-than不要設置太小,一般設置1000左右
    慢查詢隊列默認長度128,超過的話,按先進先出,以前的慢查詢會丟失。一般咱們設置1000。
  3. 理解命令生命週期
    慢查詢發生在第三階段
  4. 按期持久化慢查詢
    slowlog get或其餘第三方開源工具

pipeline

什麼是流水線

未使用pipeline的批量網絡通訊模型網絡

clipboard.png

假設客戶端在上海,Redis服務器在北京。相距1300千米。假設光纖速度≈光速2/3,即30000千米/秒2/3。那麼一次命令的執行時間就是(13002)/(300002/3)=13毫秒。Redis萬級QPS,一次命令執行時間只有0.1毫秒,所以網絡傳輸消耗13毫秒是不能接受的。在N次命令操做下,Redis的使用效率就不是很高了。運維

使用pipeline的網絡通訊模型maven

clipboard.png

客戶端實現

引入maven依賴工具

<dependency>
  <groupId>redis.clients</groupId>
  <artifacId>jedis</artifacId>
  <version>2.9.0</version>
  <type>jar</type>
  <scope>compile</scope>
</dependency>
// 不用pipeline
Jedis jedis = new Jedis("127.0.0.1", 6379);
for (int i = 0; i < 10000; i++) {
    jedis.hset("hashkey" + i, "field" + i, "value=" + i);
}

不用pipeline,10000次hset,總共耗時50s,不一樣網絡環境可能有所不一樣spa

// 使用pipeline, 咱們將10000條命令分100次pipeline,每次100條命令
Jedis jedis = new Jedis("127.0.0.1", 6379);
for (int i = 0; i < 100; i++) {
    Pipeline pipeline = jedis.pipeline();
    for (int j = i * 100; j < (i + 1) * 100; j++) {
        pipeline.hset("hashkey:" + j, "field" + j, "value" + j);
    }
    pipeline.syncAndReturnAll();
}

使用pipelne,10000次hset,總共耗時0.7s,不一樣網絡環境可能有所不一樣。code

可見在執行批量命令時,使用pipeline對Redis的使用效率提高是很是明顯的。生命週期

與M原生操做對比

mset、mget等操做是原子性操做,一次m操做只返回一次結果。
pipeline非原子性操做,只是將N次命令打個包傳輸,最終命令會被逐條執行,客戶端接收N次返回結果。

pipeline使用建議

  1. 注意每次pipeline攜帶數據量
    pipeline主要就是壓縮N次操做的網絡時間。可是pipeline的命令條數也不建議過大,避免單次傳輸數據量過大,客戶端等待過長。
  2. Redis集羣中,pipeline每次只做用在一個Reids節點上

發佈訂閱

角色

  • 發佈者(publisher)
  • 訂閱者(subscriber)
  • 頻道(channel)

模型

clipboard.png
訂閱者能夠訂閱多個頻道

API

發佈

API:publish channel message

redis> publish sohu:tv "hello world"
(integer) 3 #訂閱者個數
redis> publish sohu:auto "taxi"
(integer) #沒有訂閱者

訂閱

API:subscribe [channel] #一個或多個

redis> subscribe sohu:tv
1) "subscribe"
2) "sohu:tv"
3) (integer) 1
1) "message"
2) "sohu:tv"
3) "hello world"

取消訂閱

API:unsubscribe [channel] #一個或多個

redis> unsubscribe sohu:tv
1) "unsubscribe"
2) "sohu:tv"
3) (integer) 0

其餘API

  • psubscribe [pattern...] #訂閱指定模式
  • punsubscribe [pattern...] #退訂指定模式
  • pubsub channels #列出至少有一個訂閱者的頻道
  • pubsub numsubs [channel...] #列出給定頻道的訂閱者數量

對比消息隊列

消息隊列模型
clipboard.png

發佈訂閱模型,訂閱者均能收到消息。消息隊列,只有一個訂閱者能收到消息。所以使用發佈訂閱仍是消息隊列,要搞清楚使用場景。

geo

geo是什麼

GEO:存儲經緯度,計算兩地距離,範圍計算等。

相關命令

API:geoadd key longitude latitude member # 增長地理位置信息

redis> geoadd cities:locations 116.28 39.55 bejing
(integer) 1
redis> geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 4

API:geopos key member [member...] # 獲取地理位置信息

redis> geopos cities:locations tianjin
1)1) "117.12000042200088501"
  2) "39.0800000535766543"

API:geodist key member1 member2 [unit] # 獲取兩位置距離,unit:m(米)、km(公里)、mi(英里)、ft(尺)

reids> geodist cities:locations tianjin beijing km
"89.2061"

API:
獲取指定位置範圍內的地理位置信息集合
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

withcoord: 返回結果中包含經緯度
withdist: 返回結果中包含距離中心節點的距離
withhash: 返回結果中包含geohash
COUNT count:指定返回結果的數量
asc|desc:返回結果按照距離中心節點的距離作升序/降序
store key:將返回結果的地理位置信息保存到指定鍵
storedist key:將返回結果距離中心點的距離保存到指定鍵

redis> georadiusbymember cities:locations beijing 150 km
1)"beijing"
2) "tianjin"
3) "tangshan"
4) "baoding"

相關說明

  1. since redis3.2+
  2. redis geo是用zset實現的,type geokey = zset
  3. 沒有刪除API,可使用zset的API:zrem key member
相關文章
相關標籤/搜索