分割槽是將你的資料分發到不同redis例項上的乙個過程,每個redis例項只是你所有key的乙個子集。文件第一部分將介紹分割槽概念,第二部分介紹分割槽的另外一種可選方案。
redis分割槽主要有兩個目的:
有許多分割槽標準。假如我們有4個redis例項r0,r1,r2,r3,有一批使用者資料user:1
,user:2
, … ,那麼有很多儲存方案可以選擇。從另一方面說,有很多different systems to map方案可以決定使用者對映到哪個redis例項。
一種最簡單的方法就是範圍分割槽,就是將不同範圍的物件對映到不同redis例項。比如說,使用者id從0到10000的都被儲存到r0,使用者id從10001到20000被儲存到r1,依此類推。
這是一種可行方案並且很多人已經在使用。但是這種方案也有缺點,你需要建一張表儲存資料到redis例項的對映關係。這張表需要非常謹慎地維護並且需要為每一類物件建立對映關係,所以redis範圍分割槽通常並不像你想象的那樣執行,比另外一種分割槽方案效率要低很多。
另一種可選的範圍分割槽方案是雜湊分割槽,這種方案要求更低,不需要key必須是object_name:
的形式,如此簡單:
還有很多分割槽方法,上面只是給出了兩個簡單示例。有一種比較高階的雜湊分割槽方法叫一致性雜湊,並且有一些客戶端和**(proxies)已經實現。
分割槽可以在程式的不同層次實現。
有些特性在分割槽的情況下將受到限制:
無論是把redis當做持久化的資料儲存還是當作乙個快取,從分割槽的角度來看是沒有區別的。當把redis當做乙個持久化的儲存(服務)時,乙個key必須嚴格地每次被對映到同乙個redis例項。當把redis當做乙個快取(服務)時,即使redis的其中乙個節點不可用而把請求轉給另外乙個redis例項,也不對我們的系統產生什麼影響,我們可用任意的規則更改對映,進而提高系統的高可用(即系統的響應能力)。
一致性雜湊能夠實現當乙個key的首選的節點不可用時切換至其他節點。同樣地,如果你增加了乙個新節點,立刻就會有新的key被分配至這個新節點。
重要結論如下:
從上面獲知,除非我們把redis當做快取使用,否則(在生產環境動態)增加和刪除節點將非常麻煩,但是使用固定的keys-instances則比較簡單。
一般情況下隨著時間的推移,資料儲存需求總會發生變化。今天可能10個redis節點就夠了,但是明天可能就需要增加到50個節點。
既然redis是如此的輕量(單例項只使用1m記憶體),為防止以後的擴容,最好的辦法就是一開始就啟動較多例項。即便你只有一台伺服器,你也可以一開始就讓redis以分布式的方式執行,使用分割槽,在同一臺伺服器上啟動多個例項。
一開始就多設定幾個redis例項,例如32或者64個例項,對大多數使用者來說這操作起來可能比較麻煩,但是從長久來看做這點犧牲是值得的。
這樣的話,當你的資料不斷增長,需要更多的redis伺服器時,你需要做的就是僅僅將redis例項從一台服務遷移到另外一台伺服器而已(而不用考慮重新分割槽的問題)。一旦你新增了另一台伺服器,你需要將你一半的redis例項從第一台機器遷移到第二台機器。
使用redis複製技術,你可以做到極短或者不停機地對使用者提供服務:
截止到目前,我們從理論上討論了redis分割槽,但是實際上是怎樣的呢?你應該採用哪種實現方案呢?
當redis集群可用,並且有相容redis 集群客戶端可用於你的程式語言,redis 集群將成為redis分割槽的實際標準.
redis集群是 query routing 和 client side partitioning的一種混合實現。
twemproxy是twitter維護的(快取)**系統,**memcached的ascii協議和redis協議。它是單執行緒程式,使用c語言編寫,執行起來非常快。它是採用apache 2.0 license的開源軟體。
twemproxy支援自動分割槽,如果其**的其中乙個redis節點不可用時,會自動將該節點排除(這將改變原來的keys-instances的對映關係,所以你應該僅在把redis當快取時使用twemproxy)。
twemproxy本身不存在單點問題,因為你可以啟動多個twemproxy例項,然後讓你的客戶端去連線任意乙個twemproxy例項。
twemproxy是redis客戶端和伺服器端的乙個中間層,由它來處理分割槽功能應該不算複雜,並且應該算比較可靠的。
更多關於twemproxy in this antirez blog post.
相對於twemproxy,另一種可選的分割槽方案是在客戶端實現一致性雜湊或者其他類似演算法。有很多客戶端已經支援一致性雜湊,如 redis-rb 和 predis.
請檢查 redis客戶端完整列表 以確認在你想要使用的程式語言,有成熟的一致性雜湊客戶端實現。
Oracle 11g筆記 分割槽表
一 分割槽表 分割槽技術,oracle允許把乙個大表分成幾部分,每部分叫乙個分割槽,然後把每個部分放在不同的物理磁碟,以提高整個資料庫的效能。每個分割槽還可以再分成幾份,這樣產生的分割槽叫子分割槽 subpartition 分割槽表邏輯上還是乙個整體。1 優點 1 分割槽技術使資料庫的可管理性變得更...
git筆記 分支
當新加某個功能時,一般會建立乙個分支。git branch new feature 建立新功能的分支 git push origin new feature 發布新分支當新功能開發完畢後需要將此分支合併到主分支。git checkout master 切換到主分支 git merge new fea...
NLP筆記 分詞
分詞標註方案 分詞工具 常見模型 維護詞典 用語句中字串與詞典進行比較,找到則切分,否則不切分。相連的字反覆出現,認為它們可能組成的是乙個詞。補充 hmm 齊次馬爾科夫假設,發射概率,轉移概率 先基於詞典進行分詞,再使用統計方法輔助 處理未登入詞和歧義詞 標籤 b begin i intermedi...