Redis命令的生命週期
- 客戶端向Redis服務器發送命令
- 命令請求在請求隊列中排隊等待處理
- 執行命令
- 返回命令結果
Redis慢查詢
- 慢查詢發生在生命週期的第三階段,是指僅僅執行命令階段比較慢被稱爲慢查詢。
- 客戶端超時不必定是慢查詢,可是慢查詢時是客戶端超時的一個可能因素。
Redis慢查詢相關配置
1. slowlog-max-len
它決定了慢查詢日誌最多能保存多少條日誌,slow log自己是一個內存中的FIFO隊列,當隊列大小超過slowlog-max-len時,最舊的一條日誌將被刪除,而最新的一條日誌加入到slow log中。java
2.slowlog-log-slower-than
它決定要對執行時間大於多少微妙(microsecond , 1秒=1,000,000 微妙)的查詢進行記錄git
慢查詢相關命令
1.slowlog get [n]
2.slowlog len
3.slowlog reset
慢查詢信息字段
- 字段1:惟一性的日誌標識符(Integer)
- 字段2:被記錄命令的執行時間點,已UNIX時間戳格式表示(Integer)
- 字段3:查詢執行時間,以微秒爲單位
- 字段4:完整的執行命令
慢查詢運維經驗
pipeline的好處
- 省略因爲單線程致使的命令排隊時間,一次命令的消耗時間=一次網絡時間 + 命令執行時間
- 比起命令執行時間,網絡時間極可能成爲系統的瓶頸
- pipeline的做用是將一批命令進行打包,而後發送給服務器,服務器執行完按順序打包返回。
- 經過pipeline,一次pipeline(n條命令)=一次網絡時間 + n次命令時間
命令 |
N個命令操做 |
1次pupeline(n個命令) |
時間 |
n次網絡+n次命令 |
1次網絡+n次命令 |
數據量 |
1條命令 |
n條命令 |
pipeline-Jedis使用
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);
}
}
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
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]
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...]
2.pfcount key1 [key2...]
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:將返回結果距離中心節點的距離保存到指定鍵