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例項中。注意:取模操作是取除的餘數,通常在多種程式語言中用%操作符實現。