目錄
一. Redis的單線程
- 說明:Redis單線程主要是指【網絡IO】和【鍵值對讀寫】操作是由一個線程來完成的
- 原因:避免多線程的並發控制問題及線程間的上下文切換
- QPS:10w級別QPS處理能力,因為大部分操作都在內存上,且采用了高效的數據結構
- 基於多路復用的Redis高性能IO模型
二. 可能影響單線程性能的操作
1. bigKey操作
bigKey會導致網絡傳輸、讀寫操作、內存消耗都變大
2. 復雜命令
復雜命令操作時間長,阻塞主線程
禁用:KEYS(使用SCAN命令代替)/FLUSHALL/FLUSHDB
SORT/SUNION/ZUNIONSTORE
3. 大量key集中過期
a.) Redis的過期機制也是在主線程中執行的,大量key集中過期會觸發主動刪除key策略
b.) 主動刪除key策略
4. 淘汰策略
- 淘汰策略也是在主線程執行的,當內存超過Redis的 maxMemory 上限后,每次寫入都會執行淘汰策略
- 淘汰策略
5. 主從全量同步生成RDB
主從同步雖然采用fork子進程生成數據快照,但fork這一瞬間也會阻塞主線程,實例內存越大,阻塞時間越久
6. AOF刷盤開啟always機制
每次寫入都需要刷盤,寫入硬盤的速度遠比寫內存慢,會拖慢Redis的性能
三. 使用規范
- key 的長度盡量短,節省內存空間(長度越長,額外需要內存就越大)
- 避免 bigkey,防止阻塞主線程
- 批量操作建議 MGET/MSET 替代 GET/SET,HMGET/HMSET 替代 HGET/HSET
- 禁止使用 KEYS/FLUSHALL/FLUSHDB 命令
- 避免集中過期 key
- 使用連接池操作 Redis,並設置合理的參數,避免短連接
- 讀請求量很大時,建議讀寫分離,寫請求量很大,建議使用切片集群
- 實例設置最大連接數,防止過多客戶端連接導致實例負載過高,影響性能
- 單個實例內存建議控制在 10G 以下,大實例在主從全量同步、備份時有阻塞風險
- 設置合理的 repl-backlog,降低主從全量同步的概率
- 設置合理的 slave client-output-buffer-limit,避免主從復制中斷情況發生
- 推薦在從節點上備份,不影響主節點性能
- 不開啟 AOF 或開啟 AOF 配置為每秒刷盤,避免磁盤 IO 拖慢 Redis 性能