Redis命令的生命周期 客戶端向Redis伺服器發送命令 命令請求在請求隊列中排隊等待處理 執行命令 返回命令結果 Redis慢查詢 慢查詢發生在生命周期的第三階段,是指僅僅執行命令階段比較慢被稱為慢查詢。 客戶端超時不一定是慢查詢,但是慢查詢時是客戶端超時的一個可能因素。 慢查詢發生在生命周期的 ...
-
客戶端向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:唯一性的日誌標識符(Integer)
-
欄位2:被記錄命令的執行時間點,已UNIX時間戳格式表示(Integer)
-
欄位3:查詢執行時間,以微秒為單位
-
欄位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次命令時間
命令 | 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() {
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:將返回結果距離中心節點的距離保存到指定鍵
-