爲什麼爲有集羣
- 在 Redis3 版本之前,每臺 Redis 機器需要存儲所有 Redis key ,這要求每臺 Redis 機器有足夠大的內存
- 而且只能是主節點寫,從節點讀,對於高併發情況下會有性能瓶頸
- 雖然有哨兵模式來保證服務的高用,但是切換主節點還是需要時間的(實測)
分佈式數據庫
分佈式數據庫指將數據均勻的分佈到每個節點上,可以做數據冗餘來排除故障,每個節點負責數據的一個子集
如何進行分區
常見的分區規則 哈希分區,順序分區,Redis 集羣使用了哈希分區 虛擬槽分區 方式
所有的鍵根據哈希函數 (CRC16[key]&16383) 映射到0-16383槽內,共16384個槽位,每個節點維護部分槽及槽所映射的鍵值數據
哈希函數: Hash()=CRC16[key]&16383 按位與
Redis用虛擬槽分區原因:解耦數據與節點關係,節點自身維護槽映射關係,分佈式存儲
Redis集羣的不足
- 鍵的批量操作支持有限,比如mset, mget,如果多個鍵映射在不同的槽,就不支持了
- 鍵事務支持有限,當多個key分佈在不同節點時無法使用事務,同一節點是支持事務
- 鍵是數據分區的最小粒度,不能將一個很大的鍵值對映射到不同的節點
- 不支持多數據庫,只支持 0 數據庫
- 主從結構只支持單層結構,不支持樹型結構