Redis 分割槽
Redis 分割槽
分割槽是分割資料到多個Redis例項的處理過程,因此每個例項只儲存key的一個子集。
分割槽的優勢
- 通過利用多臺計算機記憶體的和值,允許我們構造更大的資料庫。
- 通過多核和多臺計算機,允許我們擴充套件計算能力;通過多臺計算機和網路介面卡,允許我們擴充套件網路頻寬。
分割槽的不足
redis的一些特性在分割槽方面表現的不是很好:
- 涉及多個key的操作通常是不被支援的。舉例來說,當兩個set對映到不同的redis例項上時,你就不能對這兩個set執行交集操作。
- 涉及多個key的redis事務不能使用。
- 當使用分割槽時,資料處理較為複雜,比如你需要處理多個rdb/aof檔案,並且從多個例項和主機備份持久化檔案。
- 增加或刪除容量也比較複雜。redis叢集大多數支援在執行時增加、刪除節點的透明資料平衡的能力,但是類似於客戶端分割槽、代理等其他系統則不支援這項特性。然而,一種叫做presharding的技術對此是有幫助的。
分割槽型別
Redis 有兩種型別分割槽。 假設有4個Redis例項 R0,R1,R2,R3,和類似user:1,user:2這樣的表示使用者的多個key,對既定的key有多種不同方式來選擇這個key存放在哪個例項中。也就是說,有不同的系統來對映某個key到某個Redis服務。
範圍分割槽
最簡單的分割槽方式是按範圍分割槽,就是對映一定範圍的物件到特定的Redis例項。
比如,ID從0到10000的使用者會儲存到例項R0,ID從10001到 20000的使用者會儲存到R1,以此類推。
這種方式是可行的,並且在實際中使用,不足就是要有一個區間範圍到例項的對映表。這個表要被管理,同時還需要各 種物件的對映表,通常對Redis來說並非是好的方法。
雜湊分割槽
另外一種分割槽方法是hash分割槽。這對任何key都適用,也無需是object_name:
- 用一個hash函式將key轉換為一個數字,比如使用crc32 hash函式。對key foobar執行crc32(foobar)會輸出類似93024922的整數。
- 對這個整數取模,將其轉化為0-3之間的數字,就可以將這個整數對映到4個Redis例項中的一個了。93024922 % 4 = 2,就是說key foobar應該被存到R2例項中。注意:取模操作是取除的餘數,通常在多種程式語言中用%操作符實現。