任何一個後端應用,包括代碼都要考慮對於CPU和內存的影響.redis本質上類似於nodejs,單進程、單線程,事件驅動,但不同的是redis是CPU密集型的。這裏列出了redis與內存CPU的相關考慮點。
單進程、單線程的redis如何實現高併發
同nodejs類似
* 優點:
1. 採用多路 I/O 複用技術可以讓單個線程高效的處理多個連接請求;
2. 避免線程切換而消耗CPU
* 缺點:
1. 無法發揮多核CPU性能,不過可以通過在單機開多個Redis實例來完善
如果redis內存滿了怎麼辦
- 增加內存
- 使用內存淘汰策略
- 搭建redis集羣
如果redis導致CPU過高怎麼辦
- 連接數過多,通過
redis-cli info | grep connected_clients
查看當前連接
解決:- 關閉殭屍連接;
redis-cli
登錄後,client list
查看所有客戶端連接,client kill ${ip}:${port}
關閉連接; - 修改最大連接數
maxclients: 10000
,默認10000; - 修改redis timeout參數: 修改配置文件中的
timeout
設置redis的keepalive時間。客戶端斷連的包發出去後,redis server沒有接受到,則會出現redis server以爲連接正常的情況。因此需要在redis server 啓動超時設置,如果在一定的時間內,客戶端沒有消息過來,則redis server主動斷開連接。 - 修改redis進程的文件數限制:
echo -n "Max open files 3000:3000" > /proc/PID/limits
- 修改系統參數的最大文件數限制:
/etc/security/limits.conf
; redis服務器默認設置的最大連接數maxclients是10000,但是受服務器最大文件數影響,服務器默認最大文件數是1024,所以redis最大連接也爲1024-32=992; 解決辦法
- 關閉殭屍連接;
- 慢查詢,因爲redis是單線程,如果有慢查詢的話,會阻塞住之後的操作,通過redis日誌查
- value值過大:如果是純文本,可以考慮換種存儲方式,如果是對象,可以考慮用hash;
- aof重寫/rdb fork發生?瞬間會堵一下Redis服務器
redis性能優化
- Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啓用內存快照做持久化。
- 如果數據比較關鍵,某個Slave開啓AOF備份數據,策略爲每秒同步一次。
- 爲了主從複製的速度和連接的穩定性,Slave和Master最好在同一個局域網內。
- 儘量避免在壓力較大的主庫上增加從庫。
- 爲了Master的穩定性,主從複製不要用圖狀結構,用單向鏈表結構更穩定,即主從關係爲:Master<--Slave1<--Slave2<--Slave3.......,這樣的結構也方便解決單點故障問題,實現Slave對Master的替換,也即,如果Master掛了,可以立馬啓用Slave1做Master,其他不變
- 使用Redis負載監控工具:redis-monitor,它是一個Web可視化的 redis 監控程序
- redis分庫,這樣方便於管理與維護。
redis佔用資源監控工具——redis-monitor
部署
OK: init configuration file into /root/.redis-monitor/redis_monitor_config.py
.
OK: database is initialed into /root/.redis-monitor/redis_monitor.db
.