## 一、慢查詢
* 客戶端請求redis的生命周期

* 配置參數
* slowlog-max-len
* 慢查詢日志是一個先進先出隊列;
* 隊列長度是固定的,超出長度是消失;
* 保存在內存中,重啟會消失。
* 默認值:128
* 推薦值:1000
* slowlog-log-slower-than
* 慢查詢閾值(單位:微妙),當命令大于多少的時候,將它記錄在慢查詢的范圍內。
* slowlog-log-slower-than = 0 ,記錄所有命令
* slowlog-log-slower-than < 0 ,不記錄任何命令
* 默認值:10000
* 推薦: 1ms
* 理解命令生命周期
* 定期持久化慢查詢
* 慢查詢命令
* slowlog get [n] : 獲取慢查詢隊列
* slowlog len : 獲取慢查詢隊列長度
* slowlog reset:清空慢查詢隊列
## 二、pipeline



* 流水線的作用
| 命令 | N個命令操作 | 1次pipeline(N個命令) |
| --- | --- | --- |
| 時間 | N次網絡 + N次命令 | 1次網絡 + N次命令 |
| 數據量 | 1條命令 | N條命令 |
* 注意
* Redis的命令時間是微妙級別。
* pipeline每次條數要控制(網絡)。
* 注意每次pipeline攜帶數據量
* pipeline每次只能作用在一個redis節點上
* M操作玉pipline的區別
* php-redis-pipeline 命令 multi (事務)
~~~php
$ret = $redis->multi()
->set('key1', 'val1')
->get('key1')
->set('key2', 'val2')
->get('key2')
->exec();
//$ret == array (
// 0 => TRUE,
// 1 => 'val1',
// 2 => TRUE,
// 3 => 'val2');
~~~
## 三、發布訂閱
* 角色
* 發布者(publisher) 是redis-cli
* 訂閱者(subscriber) 是redis-cli
* 頻道(channel) 在Redis Server內

`當發布者往頻道中發送消息,訂閱此頻道的訂閱者,可以接收到信息。類似于群聊`
`消息隊列是搶,只有一個用戶接收信息。發布訂閱是所有人接收到`
* 命令
| 名稱 | 范例 | 說明 |
| --- | --- | --- |
| publish | publish( $channel, $message ) | 發布,channel頻道,message消息 |
| subscribe | subscribe( $channels, $callback ) | 訂閱,接收頻道信息,案例如下。|
| unsubcribe | | 取消訂閱 |
~~~
function f($redis, $chan, $msg) {
switch($chan) {
case 'chan-1':
...
break;
case 'chan-2':
...
break;
case 'chan-2':
...
break;
}
}
$redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f'); // subscribe to 3 chans
~~~
## 四、位圖bitmap
## 五、HyperLogLog
* 數據結構
* 基于HyperLogLog算法:極小空間完成獨立數量統計
* 本質還是字符串
* 命令
| 名稱 | 范例 | 說明 |
| --- | --- | --- |
| pfadd | | 添加元素 |
| pfcount | | 計算hyperloglog的獨立總數 |
| pfmerge | | 合并多個hyperloglog |
## 六、GEO
* redis 3.2 新增
* 地理信息定位:存儲經緯度,計算兩地距離,范圍計算等;
* 應用場景
* 微信搖一搖
* 附近酒店餐館
* 命令
| 名稱 | 范例 | 說明 |
| --- | --- | --- |
| geopos | | 獲取地理位置信息 |
| geodist | | 獲取兩個地理位置的距離 |
| georadius | | 獲取指定位置范圍內的地理位置信息集合 |
|