一.慢查詢
1.慢查詢的生命週期
第一階段:客戶端發送命令到redis(客戶端超時不必定慢查詢,但慢查詢的客戶端超時的一個可能因素)
第二階段:由於redis是單線程,在命令執行以前都是要排隊的
第三階段:redis執行命令(慢查詢發生在第三階段)
第四階段:返回結果給客戶端
2.慢查詢的兩個配置
配置一:slowlog-max-len
(1)先進先出隊列:一條命令在第三階段執行過程當中,被列入慢查詢的範圍內,就會進入一個隊列,其實用redis的列表實現的,但它是一個先進先出的隊列
(2)固定長度:這個隊列是固定長度的,當隊列滿了以後,最早進的就會被踢出
(3)保存在內存中:當redis重啓,會消失
默認值:slowlog-max-len =128
配置二:slowlog-log-slower-than
(1)慢查詢閾值(單位:微秒[1毫秒=1000微秒])
(2)slowlog-log-slower-than=0,記錄全部命令到慢查詢
默認值:slowlog-log-slower-than = 10000
3.慢查詢的配置方法:
配置一:修改配置文件重啓
配置二:動態配置
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
4.慢查詢的三個命令
第一個命令:
slowlog get[n]:獲取慢查詢隊列,n是獲取慢查詢的多少條
第二個命令:
slowlog len:獲取慢查詢隊列長度
第三個命令:
slowlog reset:清空慢查詢隊列
5.慢查詢運維經驗
第一條:slowlog-max-len不要設置過大,默認10ms,一般設置1ms根據閾值設定,redis的qps一般是萬級別的,一般但願1秒執行一萬次,平均的時間是0.1毫秒,設置過大,必須10毫秒才能記錄這條命令,超過1毫秒對qps就會有影響
第二條:slowlog-log-slower-than不要設置太小,一般設置1000左右隊列存在內存當中,當redis重啓以後,列表就會進行清空,並且是先進先出的隊列,隨着慢查詢的數量不斷增長,最開始的慢查詢就會丟掉,對於分析歷史問題不是很方便
第三條:理解命令生命週期
第四條:按期持久化慢查詢,針對第二條,由於慢查詢存在內存當中,按期將慢查詢持久化到例如mysql,這樣就能夠查到歷史慢查詢的操做
二.pipeline流水線
1.什麼是流水線
正常一條命令:1次時間=1次網絡時間+1次命令時間
正常多條命令:n次時間=n次網絡時間+n次命令時間
流水線:將一批命令批量打包,在服務端進行批量計算,而後按順序把結果返回給客戶端,大大節省了網絡時間
1次pipeline流水線(n條命令)=1次網絡時間+n次命令時間
2.客戶端實現
3.pipeline與原生操做對比
4.使用建議
第一:注意每次pipeline攜帶數據量
第二:pipeline每次只能做用在一個redis節點上
三.發佈訂閱
1.角色
發佈者(publisher):發佈者發佈消息,發佈者會將信息發送到對應的頻道上
訂閱者(subscriber):訂閱者一直訂閱這個頻道,就會收到相應的消息
頻道(channel)
2.模型mysql
一個發佈者已經發布消息到一個頻道上了,一個新的訂閱者是沒法獲取到以前的消息,沒法作到消息堆積
3.API
命令一:發佈publish命令:
語法:publish channel message
實例:向souhu:tv發送xixi返回的結果是訂閱者數,若是是0就是沒有客戶端訂閱redis
127.0.0.1:6379> publish sohu:tv "xixi" (integer) 0
命令二:訂閱subscribe
語法:subscribe[channel] #一個或多個
實例:返回訂閱的頻道和收到消息的詳細的訂閱信息,收到消息對應的頻道算法
127.0.0.1:6379> subscribe sohu:tv Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "sohu:tv" 3) (integer) 1
命令三:取消訂閱unsubscribe
語法:unsubscribe[channel] #一個或多個
實例:取消定於souhu:tv,返回對應的結果sql
127.0.0.1:6379> unsubscribe sohu:tv 1) "unsubscribe" 2) "sohu:tv" 3) (integer) 0
4.發佈訂閱與消息隊列
四.Bitmap位圖
1.什麼是位圖
2.位圖相關命令
(1)設置整個字符串變成二進制後的第幾位的值
語法:setbit(name, offset, value)
對name對應值的二進制表示的位進行操做網絡
127.0.0.1:6379> get Name "xi" xi的二進制表示的位: x i 1111000 1101001 把第二位的1改爲0 127.0.0.1:6379> setbit Name 1 0 (integer) 1 127.0.0.1:6379> get Name "8i"
(2)獲取name對應的值的二進制表示中的某位的值(0或1)
語法:getbit(name, offset)數據結構
127.0.0.1:6379> get Name "xi" xi的二進制表示的位: x i 1111000 1101001
(3)獲取name對應的值的二進制表示中的第8位值是幾運維
127.0.0.1:6379> getbit Name 9 (integer) 1
(4)獲取name對應的值的二進制表示中1的個數
語法:bitcount(key, start=None, end=None)ui
127.0.0.1:6379> get Name "xi" xi的二進制表示的位: x i 1111000 1101001 獲取name裏1的個數有幾個 127.0.0.1:6379> bitcount Name (integer) 8
3.獨立用戶統計
使用set和Bitmap
1億用戶,5千萬獨立
4.使用經驗
type=string,最大512MB
注意setbit時的偏移量,可能有較大耗時
位圖不上絕對好
五.HyperLogLog
1.新的數據結構
基於HyperLogLog算法:極小空間完成獨立數量統計
本質仍是字符串
2.三個命令
命令一:pfadd key element[element...]:向hyperloglog添加元素
實例:作獨立id統計,向2019_06_25中添加4個uuid
127.0.0.1:6379> pfadd 2019_06_25:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-4"
(integer) 1
命了二:pfcount key[key...]:計算hyperloglog的獨立總數
實例:獨立用戶的統計
127.0.0.1:6379> pfcount 2019_06_25:unique:ids
(integer) 4
命令三:pfmerge destkey sourcekey[sourcekey...]:合併多個hyperloglog
實例:
(1)向2019_06_25中添加4個uuidspa
127.0.0.1:6379> pfadd 2019_06_25:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-4" (integer) 1
(2)向2019_06_26中添加4個uuid線程
127.0.0.1:6379> pfadd 2019_06_26:unique:ids "uuid-4" "uuid-5" "uuid-6" "uuid-7" (integer) 1
(3)合併2019_06_25和2019_06_26爲2016_06_25,26
127.0.0.1:6379> pfmerge 2016_06_25,26:unique:ids 2019_06_25:unique:ids 2019_06_26:unique:ids OK
(4)查看獨立用戶數
127.0.0.1:6379> pfcount 2016_06_25,26:unique:ids (integer) 7
3.內存消耗
4.使用經驗
是否能容忍錯誤(錯誤率:0.81%)
是否須要單條數據
六.GEO(地理信息定位)
1.GEO是什麼
存儲經緯度,計算兩地距離,範圍計算等
2.5個城市經緯度
3.相關命令
4.相關說明