redis與CPU、內存

任何一個後端應用,包括代碼都要考慮對於CPU和內存的影響.redis本質上相似於nodejs,單進程、單線程,事件驅動,但不一樣的是redis是CPU密集型的。這裏列出了redis與內存CPU的相關考慮點。node

單進程、單線程的redis如何實現高併發

同nodejs相似
* 優勢:
1. 採用多路 I/O 複用技術可讓單個線程高效的處理多個鏈接請求;
2. 避免線程切換而消耗CPU
* 缺點:
1. 沒法發揮多核CPU性能,不過能夠經過在單機開多個Redis實例來完善redis

若是redis內存滿了怎麼辦

  1. 增長內存
  2. 使用內存淘汰策略
  3. 搭建redis集羣

若是redis致使CPU太高怎麼辦

  1. 鏈接數過多,經過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; 解決辦法
  2. 慢查詢,由於redis是單線程,若是有慢查詢的話,會阻塞住以後的操做,經過redis日誌查
  3. value值過大:若是是純文本,能夠考慮換種存儲方式,若是是對象,能夠考慮用hash;
  4. aof重寫/rdb fork發生?瞬間會堵一下Redis服務器

redis性能優化

  1. Master最好不要作任何持久化工做,包括內存快照和AOF日誌文件,特別是不要啓用內存快照作持久化。
  2. 若是數據比較關鍵,某個Slave開啓AOF備份數據,策略爲每秒同步一次。
  3. 爲了主從複製的速度和鏈接的穩定性,Slave和Master最好在同一個局域網內。
  4. 儘可能避免在壓力較大的主庫上增長從庫。
  5. 爲了Master的穩定性,主從複製不要用圖狀結構,用單向鏈表結構更穩定,即主從關係爲:Master<--Slave1<--Slave2<--Slave3.......,這樣的結構也方便解決單點故障問題,實現Slave對Master的替換,也即,若是Master掛了,能夠立馬啓用Slave1作Master,其餘不變
  6. 使用Redis負載監控工具:redis-monitor,它是一個Web可視化的 redis 監控程序
  7. 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.後端

參考

  1. redis cpu佔用太高排查
  2. 單進程單線程的Redis如何可以高併發
相關文章
相關標籤/搜索