Redis中數據分片與分片策略

概述

數據分片是一種將數據分割并存儲在多個節點上的技術,可以有效提高系統的擴展性和性能。在Redis中,數據分片主要用于解決單個實例存儲容量和性能瓶頸的問題。通過將數據分散存儲到多個Redis節點中,可以將負載均衡到不同的服務器上,提高系統的吞吐量和響應速度。

數據分片的原理與實現方式

數據分片是一種將大規模數據分割并存儲在多個節點上的技術,旨在提高系統的容量和性能。在Redis中,數據分片的實現方式和原理主要有兩種:客戶端分片和服務端分片。

客戶端分片

客戶端分片是指由客戶端應用程序負責將數據分割并分配到不同的Redis節點上。具體步驟如下:

  1. 分片規則定義:?客戶端根據一定的規則將數據進行分片,通常使用哈希函數或范圍規則來確定數據應該存儲在哪個節點上。

  2. 分片映射表維護:?客戶端維護一個分片映射表,記錄每個數據項對應的Redis節點信息,以便于后續的數據讀寫操作。

  3. 數據路由:?客戶端根據分片規則選擇合適的Redis節點進行數據操作,確保數據存儲和讀取的正確性和一致性。

客戶端分片的優點是實現簡單、靈活性高,但缺點是需要客戶端維護分片映射表,并且可能會出現數據傾斜的情況。

服務端分片

服務端分片是指由Redis集群負責將數據分割并存儲在多個節點上,客戶端無需關心數據的具體分片情況,只需將請求發送到任意一個Redis節點即可。具體步驟如下:

  1. 分片規則定義:?Redis集群定義了一套分片規則,用于確定數據應該存儲在哪個節點上,通常使用哈希函數或一致性哈希算法來實現。

  2. 數據路由:?客戶端將數據請求發送到任意一個Redis節點,集群會根據分片規則將請求路由到正確的節點上進行處理。

  3. 數據分發:?Redis集群負責將數據按照分片規則分發到各個節點上進行存儲和管理。

服務端分片的優點是實現簡單、透明度高,客戶端無需關心數據的具體分片情況,但缺點是集群規模的擴展和縮減可能會引起數據的遷移和重新分片,影響系統的穩定性和性能。

選擇分片方式的考慮因素

在選擇數據分片的方式時,需要考慮以下因素:

  • 系統復雜度:?客戶端分片相對較為簡單,適用于小規模系統;而服務端分片適用于大規模系統,但實現和維護的復雜度較高。

  • 數據一致性:?服務端分片能夠保證數據的一致性和完整性,而客戶端分片可能會出現數據不一致的情況。

  • 擴展性和靈活性:?客戶端分片具有較高的靈活性,可以根據業務需求定制分片規則,但集群規模的擴展和縮減可能會受到限制;而服務端分片具有較好的擴展性和靈活性,但受制于集群規模的限制。

根據實際業務需求和系統規模,選擇合適的數據分片方式是確保系統高效運行和穩定性的關鍵。

數據分片策略

數據分片是將大規模數據分割成多個部分,并分布存儲在不同的節點上,以提高系統的容量和性能。在Redis中,實現數據分片的策略通常包括以下幾種:

哈希分片

哈希分片是將數據的鍵通過哈希函數計算得到哈希值,然后根據哈希值的范圍將數據分配到不同的節點上。常見的哈希函數有MD5、SHA1等,可以將數據均勻地分散到不同的節點上。哈希分片的特點是簡單高效,但可能會出現數據傾斜的情況,即部分節點存儲的數據量過大,而另一部分節點存儲的數據量較小。

一致性哈希分片

一致性哈希分片是一種基于一致性哈希算法的數據分片策略,它將數據的鍵通過哈希函數計算得到哈希值,并將哈希值映射到一個環形的哈希空間中。每個節點在哈希空間中占據一個區域,數據的鍵根據其哈希值順時針尋找下一個節點,直到找到一個節點為止。這樣可以保證數據在節點之間均勻分布,且節點的增加和刪除對數據的影響較小。

范圍分片

范圍分片是將數據的鍵按照一定的范圍進行劃分,并將不同范圍的數據存儲到不同的節點上。例如,可以根據數據的鍵的字母順序或數字大小來劃分范圍,然后將相應范圍內的數據存儲到對應的節點上。范圍分片的優點是可以根據業務需求靈活劃分數據的范圍,但可能會出現數據不均勻分布的情況。

混合分片

混合分片是將多種分片策略結合起來使用,以充分利用各種分片策略的優點,提高數據的均勻分布和系統的容錯能力。例如,可以先使用一致性哈希分片將數據分配到不同的虛擬節點上,然后再使用范圍分片將虛擬節點分配到不同的物理節點上,以實現數據的均勻分布和節點的負載均衡。

數據分片策略的選擇

在選擇數據分片策略時,需要考慮以下因素:

  • 數據均衡性:?數據分片策略應確保數據在各個節點上均勻分布,避免出現數據傾斜的情況。

  • 節點擴縮容:?數據分片策略應具備良好的擴縮容性能,當節點數量發生變化時,能夠盡量減少數據遷移的成本。

  • 系統復雜度:?數據分片策略應盡量簡單易實現,降低系統的復雜度和維護成本。

  • 數據一致性:?數據分片策略應保證數據的一致性和完整性,避免數據丟失或損壞的情況。

根據實際業務需求和系統規模,選擇合適的數據分片策略是確保系統高效運行和穩定性的關鍵。

一致性哈希算法

  1. 首先求出服務器(節點)的哈希值,并將其配置到0~2^32的圓(continuum)上。

  2. 然后采用同樣的方法求出存儲數據的鍵的哈希值,并映射到相同的圓上。

  3. 然后從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。如果超過2^32仍然找不到服務器,就會保存到第一臺服務器上。

Redis集群分片機制

Redis 集群沒有使用一致性hash, 而是引入了哈希槽的概念。

Redis Cluster 采用虛擬哈希槽分區,所有的鍵根據哈希函數映射到 0 ~ 16383 整數槽內,每個key通過CRC16校驗后對16384取模來決定放置哪個槽(Slot),每一個節點負責維護一部分槽以及槽所映射的鍵值數據。在Redis Cluster中,只有Master才擁有槽的所有權,如果是某個Master的slave,這個slave只負責槽的使用,但是沒有所有權。計算公式:slot = CRC16(key) % 16383。

(1)假設主節點的數量為3,將16384個槽位按照用戶自己的規則手動去分配這3個節點,16384除以3,那么每個節點大約得到5460個槽。(用戶自定義分配的原因在于有些機器的配置高,有些機器的配置低,配置高的可以分配多一點槽位,配置低的可以分配少一點槽位)

圖中定義的規則是平均分配槽位:

  1. 節點1的槽位區間范圍為0-5460,

  2. 節點2的槽位區間范圍為5461-10922

  3. 節點3的槽位區間范圍為10923-16383

(2)存儲數據時,對要存儲的鍵進行crc16哈希運算,得到一個值,并取模16384,判斷這個值在哪個節點的范圍區間。

假設crc16(“test_key”)%16384=3345,

因為3345在區間0-5460之間,

所以test_key數據寫入到節點1里面。

(3)查詢數據時,對要查詢的鍵進行crc16哈希運算,得到一個值,并取模16384,判斷這個值在哪個節點的范圍區間。

假設crc16(“test_key”)%16384=3345,

因為3345在區間0-5460之間,

所以test_key數據應該從節點1里面獲取。

以上就是redis集群采用的虛擬哈希槽的原理和計算規則說明,是不是沒有想象的那么復雜。

這種結構很容易添加或者刪除節點,并且無論是添加刪除或者修改某一個節點,都不會造成集群不可用的狀態。使用哈希槽的好處就在于可以方便的添加或移除節點。

  1. 當需要增加節點時,只需要把其他節點的某些哈希槽挪到新節點就可以了。

  2. 當需要移除節點時,只需要把移除節點上的哈希槽挪到其他節點就可以了。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46258.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Visual Studio使用——在vs中給vb.net項目添加新的窗口:新建的方式、添加已有窗口的方式

目錄 引出Visual Studio使用vb添加新的窗體自定義代碼片段vs顯示所有文件 總結Idea安裝和使用0.Java下載 和 IDEA工具1.首次新建項目2.隱藏文件不必要顯示文件3.目錄層級設置4.Settings設置選擇idea的場景提示代碼不區分大小寫 取消git的代碼作者顯示 引出 Visual Studio使用—…

基于Vue CLI 3構建Vue3項目(Vue2也可參考)

天行健,君子以自強不息;地勢坤,君子以厚德載物。 每個人都有惰性,但不斷學習是好好生活的根本,共勉! 文章均為學習整理筆記,分享記錄為主,如有錯誤請指正,共同學習進步。…

Android Framework學習筆記(4)----Zygote進程

Zygote的啟動流程 Init進程啟動后,會加載并執行init.rc文件。該.rc文件中,就包含啟動Zygote進程的Action。詳見“RC文件解析”章節。 根據Zygote對應的RC文件,可知Zygote進程是由/system/bin/app_process程序來創建的。 app_process大致處…

PHP手邊酒店多商戶版平臺小程序系統源碼

🏨【旅行新寵】手邊酒店多商戶版小程序,一鍵解鎖住宿新體驗!🛌 🌈【開篇:旅行新伴侶,盡在掌握】🌈 還在為旅行中的住宿選擇而糾結嗎?是時候告別繁瑣的搜索和比價過程&a…

MT6985(天璣9200)芯片性能參數_MTK聯發科旗艦5G移動平臺處理器

MT6985天璣 9200 旗艦移動平臺擁有專業級影像、沉浸式游戲和先進移動顯示技術,以及更快捷、覆蓋更廣的 5G 和 支持 Wi-Fi 7 連接,具有高性能、高能效、低功耗表現。率先采用 Armv9 性能核,全部支持純 64 位應用,開啟高能效架構設計…

【數據庫學習】java數據庫開發:sql解析之jsqlparser

1,概念 1) SQL 解析器 用于處理 SQL 查詢語句的解析和分析。 場景: 數據庫客戶端開發,解析用戶輸入的sql語法并執行。自定義sql解析和執行邏輯。 標準的數據庫接口(如 JDBC)無法完全滿足需求時&#xff…

音頻數據集

1 多語言 Mozilla Common Voice 下載地址:https://voice.mozilla.org/data 時長:1965小時(目前為止) 最早2017年發布,持續更新,該基金會表示,通過 Common Voice 網站和移動應用,他們…

搞定前端面試題——ES6同步與異步機制、async/await的使用以及Promise的使用!!!

文章目錄 同步和異步async/awaitPromisePromise的概念 同步和異步 ? 同步:代碼按照編寫順序逐行執行,后續的代碼必須等待當前正在執行的代碼完成之后才能執行,當遇到耗時的操作(如網絡請求等)時,主線程會…

Java二十三種設計模式-抽象工廠模式(3/23)

抽象工廠模式:復雜系統的靈活構建者 引言 在軟件開發中,抽象工廠模式是一種提供接口以創建相關或依賴對象族的創建型設計模式。這種模式允許客戶端使用一個共同的接口來創建不同的產品族,而無需指定具體類。 基礎知識,java設計模…

SpringBoot日常:常用數據類型比較

文章目錄 前言基本類型引用類型date類型比較LocalDate類型比較LocalDateTime類型比較Bigdecimal類型比較對象類型比較 前言 在Java中,我們一般分為基本類型的比較和引用類型的比較,下面按照這兩個大分類梳理一下日常用到的類型比較 基本類型 基本數據類型比較主要…

算法 —— LRU算法

算法 —— LRU算法 LRULRU算法的工作原理:實現方法:性能考慮: 模擬過程splice函數對于std::list和std::forward_list基本語法:功能描述: 示例:注意事項: 如果大家已經學習過了Cache的替換算法和…

ElementUIV12相關使用方法

今日內容 零、 復習昨日 零、 復習昨日 一、Element UI Element,一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫 官網: https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3,面向設計師和開發者的組件庫 官網: htt…

C語言--遞歸

曾經有一個段子:上大學時,我們的c語言老師說:學c時,如果有50%的同學死在了循環上面,那么就有90%的同學死在了遞歸上面。接下來,就來看看遞歸是怎么個事? 一.遞歸的介紹 遞歸是指一個函數直接或…

Spring中的@Transactional什么時候會失效?

在Spring中,Transactional注解用于聲明式事務管理,它可以使方法在事務上下文中執行。然而,Transactional注解有時會失效,這通常是由于以下幾種情況: 1. 非public方法: - Transactional注解默認只能應用…

跨平臺WPF音樂商店應用程序

目錄 一 簡介 二 設計思路 三 源碼 一 簡介 支持在線檢索音樂,支持實時瀏覽當前收藏的音樂及音樂數據的持久化。 二 設計思路 采用MVVM架構,前后端分離,子界面彈出始終位于主界面的中心。 三 源碼 視窗引導啟動源碼: namesp…

MySQL(8)事務

目錄 1.事務; 1.事務: 1.1 如果CURD不加限制會這么樣子? 可能造成數據同時被修改, 數據修改的結果是未知的.(可以想一下之前的搶票線程問題) 1.2 事務概念: 事務就是一組DML語句組成,這些語句在邏輯上存在相關性,這一組DML語句要么全部成功&#xff0…

基于python旅游景點滿意度分析設計與實現

1.1研究背景與意義 1.1.1研究背景 隨著旅游業的快速發展,滿意度分析成為評估旅游景點質量和提升游客體驗的重要手段。海口市作為中國的旅游城市之一,其旅游景點吸引了大量游客。然而,如何科學評估和提升海口市旅游景點的滿意度,…

中電金信-杭州工商銀行|面試真題|2024年

中電金信-杭州工商銀行 JAva集合用過哪些? ArrayList、LinkedList、HashSet、TreeSet、HashMap、LinkedHashMap、ConcurrentHashMap Arraylist和linkbist區別 ArrayList底層是數據,查詢快,增刪慢,線程不安全,效率高LikedList 底…

【概率論三】參數估計:點估計(矩估計、極大似然法)、區間估計

文章目錄 一. 點估計1. 矩估計法2. 極大似然法2.1. 似然函數2.2. 極大似然估計法 3. 評價估計量的標準3.1. 無偏性3.2. 有效性3.3. 一致性 二. 區間估計1. 區間估計的概念2. 正態總體參數的區間估計 參數估計講什么 由樣本來確定未知參數參數估計分為點估計與區間估計 一. 點估…

算法:二叉樹相關

目錄 題目一:單值二叉樹 題目二:二叉樹的最大深度 題目三:相同的樹 題目四:對稱二叉樹 題目五:另一棵樹的子樹 題目六:二叉樹的前序遍歷 題目七:二叉樹遍歷 題目八:根據二叉…