【Redis】單線程理解及可能影響性能的操作


一. Redis的單線程

  1. 說明:Redis單線程主要是指【網絡IO】和【鍵值對讀寫】操作是由一個線程來完成的
  2. 原因:避免多線程的並發控制問題及線程間的上下文切換
  3. QPS:10w級別QPS處理能力,因為大部分操作都在內存上,且采用了高效的數據結構
  4. 基於多路復用的Redis高性能IO模型

    在這里插入圖片描述

二. 可能影響單線程性能的操作

1. bigKey操作

bigKey會導致網絡傳輸、讀寫操作、內存消耗都變大

2. 復雜命令

復雜命令操作時間長,阻塞主線程

禁用:KEYS(使用SCAN命令代替)/FLUSHALL/FLUSHDB

SORT/SUNION/ZUNIONSTORE

3. 大量key集中過期

a.) Redis的過期機制也是在主線程中執行的,大量key集中過期會觸發主動刪除key策略

b.) 主動刪除key策略
在這里插入圖片描述

4. 淘汰策略

  1. 淘汰策略也是在主線程執行的,當內存超過Redis的 maxMemory 上限后,每次寫入都會執行淘汰策略
  2. 淘汰策略
    在這里插入圖片描述

5. 主從全量同步生成RDB

主從同步雖然采用fork子進程生成數據快照,但fork這一瞬間也會阻塞主線程,實例內存越大,阻塞時間越久

6. AOF刷盤開啟always機制

每次寫入都需要刷盤,寫入硬盤的速度遠比寫內存慢,會拖慢Redis的性能

三. 使用規范

  1. key 的長度盡量短,節省內存空間(長度越長,額外需要內存就越大)
  2. 避免 bigkey,防止阻塞主線程
  3. 批量操作建議 MGET/MSET 替代 GET/SET,HMGET/HMSET 替代 HGET/HSET
  4. 禁止使用 KEYS/FLUSHALL/FLUSHDB 命令
  5. 避免集中過期 key
  6. 使用連接池操作 Redis,並設置合理的參數,避免短連接
  7. 讀請求量很大時,建議讀寫分離,寫請求量很大,建議使用切片集群
  8. 實例設置最大連接數,防止過多客戶端連接導致實例負載過高,影響性能
  9. 單個實例內存建議控制在 10G 以下,大實例在主從全量同步、備份時有阻塞風險
  10. 設置合理的 repl-backlog,降低主從全量同步的概率
  11. 設置合理的 slave client-output-buffer-limit,避免主從復制中斷情況發生
  12. 推薦在從節點上備份,不影響主節點性能
  13. 不開啟 AOF 或開啟 AOF 配置為每秒刷盤,避免磁盤 IO 拖慢 Redis 性能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM