慢查詢原因分析
由於 Redis 是單線程的,它內部維護了一個命令隊列,所以當有耗時的命令出現時,比如 keys *
,後面的命令會被阻塞,通查查出慢查詢可以對服務進一步優化。
- 設置慢查詢閥值:默認10 毫秒,以微秒爲單位
6379>config set slowlog-log-slower-than 10000
可直接修改 redis.conf 加上 slowlog-log-slower-than 10000
slow-max-len 用來設置慢查詢條數
- 執行 slowlog get 獲取慢查詢,格式如下
一般會定期將慢查詢進行導出到 mysql 或其它存儲,用於業務人員查看哪裏出現了慢查詢
管道 pipeline
上篇文章展示了在控制檯中如何使用管道來導入 mysql 數據 ,但管道一般在應用程序中使用
Object execute = redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
for (int i = 0; i < 1000000; i++) {
String key = "123" + i;
connection.set(key.getBytes(), key.getBytes());
}
List<Object> result = connection.closePipeline();
return result;
}
});
發佈訂閱 (publish/subscribe)
Redis 的發佈訂閱比較簡單,不適合於專業的場景,會有消息丟失,無法回溯等問題,這個發佈訂閱一般是用在 Redis 內部使用,比如哨兵的監控
專業的發佈訂閱建議還是使用 kafka 或者 rabbitmq
rabbitmq 可參考我的另一篇文章 Rabbitmq
一些實用命令
-
查詢連接的佔用情況,哪臺主機佔用多少連接,用於排查連接耗光問題
redis-cli -a <密碼> client list | awk '{print $1}' | cut -d "=" -f2 | cut -d: -f 1 | sort -n | uniq -c
- 查詢當前內存使用情況
6379> info Memory
-
在所有 key 裏面返回隨機一個 key ,可以用於抽獎
randomkey