分片(partitioning)就是將你的資料拆分到多個 Redis 實例的過程,這樣每個實例將只包含所有鍵的子集。本文第一部分將向你介紹分片的概念,第二部分將向你展示 Redis 分片的選配。
分片能做什麼
Redis 的分片承擔著兩個主要目標:
1、允許使用很多電腦的記憶體總和來支援更大的資料庫。沒有分片,你就被局限於單機能支援的記憶體容量。
2、允許伸縮運算能力到多核心或多伺服器,伸縮網路頻寬到多伺服器或多網路介面卡。
分片基礎
有很多不同的分片標準(criteria)。假想我們有4 個Redis 實例R0,R1,R2,R3,還有很多表示用戶的鍵,像user:1,user:2,… 等等,我們可以找到不同的方式來選擇一個指定的鍵存儲在哪個實例中。換句話說,有許多不同的方法來映射一個鍵到一個指定的 Redis 伺服器。
最簡單的執行分片的方式之一是範圍分片(range partitioning),透過映射物件的範圍到指定的 Redis 實例來完成分片。例如,我可以假設使用者從 ID 0 到 ID 10000 進入實例 R0,使用者從 ID 10001 到 ID 20000 進入實例 R1,等等。
這套辦法行得通,事實上在實務上被採用,然而,這有一個缺點,就是需要一個映射範圍到實例的表格。這張表需要管理,不同類型的物件都需要一個表,所以範圍分片在 Redis 中常常並不可取,因為這要比替他分片可選方案低效得多。
一種範圍分片的替代方案是哈希分片(hash partitioning)。這個模式適用於任何鍵,不需要鍵像object_name: 這樣的餓形式,就像這樣簡單:
1、使用一個雜湊函數(例如,crc32 雜湊函數) 將鍵名轉換為一個數字。例如,如果鍵是 foobar,crc32(foobar)將會輸出類似 93024922 的東西。
2、對這個資料進行取模運算,以將其轉換為 0 到 3 之間的數字,這樣這個數字就可以映射到我的 4 台 Redis 實例之一。 93024922 模 4 等於 2,所以我知道我的鍵 foobar 應儲存到 R2 實例。注意:取模運算傳回除法運算的餘數,在許多程式語言總是實作為%運算符。
有許多其他的方式可以分片,從這兩個例子中你就可以知道了。一種哈希分片的高級形式稱為一致性哈希(consistent hashing),被一些 Redis 客戶端和代理實現。
分片的不同實作
分片可由軟體堆疊中的不同部分來承擔。
1、客戶端分片(Client side partitioning)意味著,客戶端直接選擇正確的節點來寫入和讀取指定鍵。許多 Redis 客戶端實現了客戶端分片。
2、代理協助分片(Proxy assisted partitioning)意味著,我們的客戶端發送請求到一個可以理解 Redis 協議的代理上,而不是直接發送請求到 Redis 實例上。代理程式會根據配置好的分片模式,來保證轉送我們的請求到正確的 Redis 實例,並回傳回應給客戶端。 Redis 和 Memcached 的代理 Twemproxy 實現了代理協助的分片。
3、查詢路由(Query routing)意味著,你可以傳送你的查詢到一個隨機實例,這個實例會保證轉送你的查詢到正確的節點。 Redis 叢集在客戶端的幫助下,實現了查詢路由的一種混合形式 (請求不是直接從 Redis 實例轉發到另一個,而是客戶端收到重定向到正確的節點)。
分片的缺點
Redis 的一些特性與分片在一起時玩的不是很好:
1、涉及多個鍵的操作通常不支援。例如,你不能對映射在兩個不同 Redis 實例上的鍵執行交集(事實上有辦法做到,但不是直接這麼幹)。
2、涉及多個鍵的事務不能使用。
3、分片的粒度(granularity)是鍵,所以不能使用一個很大的鍵來分片資料集,例如一個很大的有序集合。
4、當使用了分片,資料處理變得更複雜,例如,你需要處理多個 RDB/AOF 文件,備份資料時你需要聚合多個實例和主機的持久化文件。
5、新增和刪除容量也很複雜。例如,Redis 叢集具有運行時動態添加和刪除節點的能力來支援透明地再均衡數據,但是其他方式,像客戶端分片和代理程式都不支援這個特性。但是,有一種稱為預分片(Presharding)的技術在這一點上能幫上忙。
資料儲存還是快取
儘管無論是將Redis 作為資料儲存還是緩存,Redis 的分片概念上都是一樣的,但是作為數據儲存時有一個重要的限制。當 Redis 作為資料儲存時,一個給定的鍵總是映射到相同的 Redis 實例。當Redis 作為快取時,如果一個節點不可用而使用另一個節點,這並不是一個什麼大問題,按照我們的願望來改變鍵和實例的映射來改進系統的可用性(就是系統回復我們查詢的能力) 。
一致性雜湊實作常常能夠在指定鍵的首選節點不可用時切換到其他節點。類似的,如果你加入一個新節點,部分資料就會開始被儲存到這個新節點。
這裡的主要概念如下:
1、如果 Redis 用作緩存,使用一致性哈希來實現伸縮擴展(scaling up and down)是很容易的。
2、如果 Redis 用作存儲,使用固定的鍵到節點的映射,所以節點的數量必須固定不能改變。否則,當增刪節點時,就需要一個支援再平衡節點間鍵的系統,目前只有 Redis 叢集可以做到這一點,但是 Redis 叢集現在還處在 beta 階段,尚未考慮再生產環境中使用。
預分片
我們已經知道分片存在的一個問題,除非我們使用Redis 作為緩存,增加和刪除節點是一件很棘手的事情,使用固定的鍵和實例映射要簡單得多。
然而,資料儲存的需求可能一直在變化。今天我可以接受 10 個 Redis 節點(實例),但明天我可能需要 50 個節點。
因為 Redis 只有相當少的記憶體佔用(footprint)而且輕量級(一個空閒的實例只是用 1MB 記憶體),一個簡單的解決辦法是一開始就開啟很多的實例。即使你一開始只有一台伺服器,你也可以在第一天就決定生活在分散式的世界裡,使用分片來運行多個 Redis 實例在一台伺服器上。
你一開始就可以選擇很多數量的實例。例如,32 或 64 個實例能滿足大多數的用戶,並且為未來的成長提供足夠的空間。
這樣,當你的資料儲存需要成長,你需要更多的 Redis 伺服器,你要做的就是簡單地將實例從一個伺服器移到另一個伺服器。當你新加入了第一台伺服器,你就需要把一半的 Redis 實例從第一台伺服器搬到第二台,如此等等。
使用 Redis 複製,你就可以在很小或根本不需要停機時間內完成移動資料:
1、在你的新伺服器上啟動一個空實例。
2、移動數據,配置新實例為來源實例的從服務。
3、停止你的客戶端。
4、更新被移動實例的伺服器 IP 位址配置。
5、向新伺服器上的從節點發送 SLAVEOF NO ONE 指令。
6、以新的更新設定啟動你的客戶端。
7、最後關掉掉舊伺服器上不再使用的實例。
Redis 分片的實作
Redis 叢集是自動分片和高可用的首選方式。目前還不能完全用於生產環境,但已經進入了 beta 階段。
一旦 Redis 叢集可用,以及支援 Redis 叢集的用戶端可用,Redis 叢集將會成為 Redis 分片的事實標準。
Redis 叢集是查詢路由和客戶端分片的混合模式。
Twemproxy 是 Twitter 開發的一個支援 Memcached ASCII 和 Redis 協定的代理。它是單線程的,由 C 語言編寫,運行非常的快。他是基於 Apache 2.0 許可的開源專案。
Twemproxy 支援自動在多個Redis 實例間分片,如果節點不可用時,還有可選的節點排除支援(這會改變鍵和實例的映射,所以你應該只在將Redis 作為緩存是才使用這個特性)。
這不是單點故障(single point of failure),因為你可以啟動多個代理,並且讓你的客戶端連接到第一個接受連接的代理。
Twemproxy 以外的可選方案,是使用實作了客戶端分片的客戶端,透過一致性雜湊或別的類似演算法。有多個支援一致性雜湊的 Redis 用戶端,例如 Redis-rb 和 Predis。
更多redis知識請關注redis資料庫教學欄位。
以上是redis分片詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Redis的數據模型和結構包括五種主要類型:1.字符串(String):用於存儲文本或二進制數據,支持原子操作。 2.列表(List):有序元素集合,適合隊列和堆棧。 3.集合(Set):無序唯一元素集合,支持集合運算。 4.有序集合(SortedSet):帶分數的唯一元素集合,適用於排行榜。 5.哈希表(Hash):鍵值對集合,適合存儲對象。

Redis的數據庫方法包括內存數據庫和鍵值存儲。 1)Redis將數據存儲在內存中,讀寫速度快。 2)它使用鍵值對存儲數據,支持複雜數據結構,如列表、集合、哈希表和有序集合,適用於緩存和NoSQL數據庫。

Redis是一個強大的數據庫解決方案,因為它提供了極速性能、豐富的數據結構、高可用性和擴展性、持久化能力以及廣泛的生態系統支持。 1)極速性能:Redis的數據存儲在內存中,讀寫速度極快,適合高並發和低延遲應用。 2)豐富的數據結構:支持多種數據類型,如列表、集合等,適用於多種場景。 3)高可用性和擴展性:支持主從復制和集群模式,實現高可用性和水平擴展。 4)持久化和數據安全:通過RDB和AOF兩種方式實現數據持久化,確保數據的完整性和可靠性。 5)廣泛的生態系統和社區支持:擁有龐大的生態系統和活躍社區,

Redis的關鍵特性包括速度、靈活性和豐富的數據結構支持。 1)速度:Redis作為內存數據庫,讀寫操作幾乎瞬時,適用於緩存和會話管理。 2)靈活性:支持多種數據結構,如字符串、列表、集合等,適用於復雜數據處理。 3)數據結構支持:提供字符串、列表、集合、哈希表等,適合不同業務需求。

Redis的核心功能是高性能的內存數據存儲和處理系統。 1)高速數據訪問:Redis將數據存儲在內存中,提供微秒級別的讀寫速度。 2)豐富的數據結構:支持字符串、列表、集合等,適應多種應用場景。 3)持久化:通過RDB和AOF方式將數據持久化到磁盤。 4)發布訂閱:可用於消息隊列或實時通信系統。

Redis支持多種數據結構,具體包括:1.字符串(String),適合存儲單一值數據;2.列表(List),適用於隊列和棧;3.集合(Set),用於存儲不重複數據;4.有序集合(SortedSet),適用於排行榜和優先級隊列;5.哈希表(Hash),適合存儲對像或結構化數據。

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具