1. 單線程模型(核心命令處理)
- 單線程優勢:Redis 的核心命令處理是單線程的(基于內存操作,避免多線程競爭),所有命令按順序執行,天然避免了多線程的鎖競爭和上下文切換開銷。
- 非阻塞 I/O 多路復用:通過
epoll
/kqueue
等 I/O 多路復用技術,單線程可以高效處理大量并發連接,適合高并發的網絡請求場景。 - 避免長阻塞操作:單線程模型要求所有操作必須快速完成,因此需避免
KEYS *
、復雜 Lua 腳本等耗時操作,防止阻塞后續請求。
2. 原子操作
- 單命令原子性:Redis 的單個命令(如
INCR
、HSET
、LPUSH
)是原子執行的,無需額外鎖。 - 組合命令原子性:
- 事務(MULTI/EXEC):通過事務將多個命令打包為一個原子操作(但無回滾機制)。
- Lua 腳本:通過執行 Lua 腳本(
EVAL
/EVALSHA
)實現多個命令的原子執行,適用于復雜邏輯(如庫存扣減)。
3. 分布式鎖(解決跨進程/服務并發)
- SETNX + 超時:使用
SET key value NX PX milliseconds
實現非阻塞鎖,防止死鎖。 - Redlock 算法:Redis 官方推薦的分布式鎖算法,通過多節點協同提高鎖的可靠性(需部署多個 Redis 實例)。
- 看門狗機制:客戶端(如 Redisson)可自動續期鎖的過期時間,防止任務未完成鎖已過期。
4. 樂觀鎖(Watch機制)
- CAS(Check-And-Set):通過
WATCH
命令監聽鍵,若事務執行前鍵被修改,則事務失敗,需重試。
WATCH balance
balance = GET balance
if balance >= 100:MULTIDECRBY balance 100EXEC
else:UNWATCH
5. 集群與分片
- Redis Cluster:通過分片(16384 個槽)將數據分布到多個節點,分散并發壓力。
- 讀寫分離:主節點處理寫請求,從節點處理讀請求,提升讀并發能力(需注意主從同步延遲)。
6. 持久化與高可用
- 異步持久化:通過 RDB(快照)和 AOF(日志)持久化數據,避免阻塞主線程。
- 主從復制:數據異步復制到從節點,故障時自動切換(Sentinel 或 Cluster 模式),保證高可用。
7. 性能優化建議
- Pipeline 批量操作:減少網絡往返次數,提升吞吐量。
- 連接池:復用連接,避免頻繁建立連接的開銷。
- 避免大 Key:單個 Key 的 Value 不宜過大(如超過 10KB),防止操作耗時。
總結
Redis 通過單線程模型、原子操作、分布式鎖和集群分片等機制,在保證高性能的同時解決并發問題。實際應用中需結合業務場景選擇合適方案(如原子命令、Lua 腳本或分布式鎖),并注意避免阻塞操作和合理設計數據模型。