一、Redis 支持三種主要的集羣模式
-
主從複製模式(Master-Slave Replication):
- 在這種模式下,主節點(Master)負責處理寫入操作,而從節點(Slave)則是主節點的副本,用於處理讀取操作和提供數據冗餘。這種模式通過複製主節點的數據到多個從節點來提高數據的可用性和讀取性能。當主節點發生故障時,可以從從節點中選舉一個新的主節點,以此來實現高可用性。
-
哨兵模式(Sentinel):
- 哨兵模式是在主從複製模式的基礎上增加了自動故障轉移的功能。哨兵節點(Sentinel)監控主節點和從節點的狀態,當主節點出現故障時,哨兵會自動將一個從節點升級爲新的主節點,並通知其他從節點和客戶端新的主節點地址,以此來保證Redis服務的高可用性。
-
集羣模式(Cluster):
- Redis集羣模式通過數據分片(sharding)來實現分佈式存儲。集羣中的每個節點負責一部分數據(即一部分哈希槽),並且每個主節點可以有一個或多個從節點。集羣模式不僅支持數據的自動分區,還支持主從複製和故障轉移,從而實現了高可用性和可擴展性。
這三種模式各有特點和適用場景,可以根據業務需求和系統架構來選擇合適的集羣模式。主從複製模式和哨兵模式主要用於提高數據的可用性和讀取性能,而集羣模式則更適合於需要橫向擴展和處理大量數據的場景。
二、Redis集羣常用運維指令
Redis集羣模式下的運維指令主要用於集羣的搭建、管理、監控和維護。以下是一些常用的Redis集羣運維指令:
-
創建集羣:
redis-cli --cluster create host1:port1 host2:port2 ... hostN:portN --cluster-replicas N
這個命令用於創建一個新的Redis集羣,其中
host1:port1 ... hostN:portN
是集羣節點的地址和端口,--cluster-replicas N
指定了每個主節點的從節點數量。 -
檢查集羣狀態:
redis-cli --cluster check host:port
這個命令用於檢查指定Redis集羣節點的狀態。
-
獲取集羣信息:
redis-cli --cluster info host:port
這個命令用於獲取集羣的相關信息,如集羣狀態、節點信息等。
-
添加節點到集羣:
redis-cli --cluster add-node new_host:new_port existing_host:existing_port node_id
這個命令用於將新節點添加到現有的集羣中。
new_host:new_port
是新節點的地址和端口,existing_host:existing_port
是現有集羣中任意節點的地址和端口,node_id
是現有節點的ID。 -
刪除節點從集羣:
redis-cli --cluster del-node host:port node_id
這個命令用於從集羣中刪除指定的節點。
host:port
是執行命令的節點地址和端口,node_id
是要刪除的節點ID。 -
重新分配槽位:
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to new_node_id --cluster-slots num_slots
這個命令用於在集羣中重新分配槽位。
--cluster-from
指定源節點ID,--cluster-to
指定目標節點ID,--cluster-slots
指定要遷移的槽位數量。 -
集羣重平衡:
redis-cli --cluster rebalance host:port --cluster-weight node1=w1 ... nodeN=wN
這個命令用於根據指定的權重對集羣節點的槽位進行重平衡。
-
設置節點超時時間:
redis-cli --cluster set-timeout host:port milliseconds
這個命令用於設置集羣節點的超時時間。
-
導入外部Redis數據到集羣:
redis-cli --cluster import host:port --cluster-from host:port
這個命令用於將外部Redis實例的數據導入到集羣中。
-
執行集羣操作:
redis-cli --cluster call host:port command arg1 arg2 ...
這個命令用於在集羣的所有節點上執行指定的命令。
Redis 支持多種數據結構,每種數據結構都有其特定的使用場景和優勢。以下是 Redis 的主要數據結構及其適用場景:
-
字符串(String):
- 適用場景:字符串是最基本的類型,可以存儲任何形式的數據,比如文本、數字、JSON 等。常用於緩存功能,如緩存用戶的會話信息、存儲配置參數、計數器等。
-
列表(List):
- 適用場景:列表是一個有序的字符串集合,可以實現棧(先進後出)或隊列(先進先出)的功能。適用於消息隊列、最新列表(如微博動態)、排行榜等場景。
-
集合(Set):
- 適用場景:集合是一個無序且元素唯一的集合。適用於存儲不重複的數據集、實現共同好友功能、標籤系統、發佈/訂閱模型等。
-
有序集合(Sorted Set):
- 適用場景:有序集合中的每個元素都關聯一個分數(score),元素按分數有序排列。適用於排行榜、範圍查詢(如獲取排名前 10 的用戶)、計分板等。
-
哈希表(Hash):
- 適用場景:哈希表是一個鍵值對集合,適合存儲對象。適用於存儲用戶信息、緩存網站對象、存儲多個相關字段的數據等。
-
位圖(Bitmap):
- 適用場景:位圖是字符串的特例,通常用於表示大量的布爾值。適用於統計活躍用戶、權限控制、狀態標記等。
-
超日誌(HyperLogLog):
- 適用場景:超日誌是一種概率數據結構,用於高效地估算集合中唯一元素的數量(基數)。適用於統計網站訪問獨立IP數、分析大集合的基數等。
-
地理空間(Geo):
- 適用場景:地理空間數據結構用於存儲地理位置信息,並能夠執行地理位置查詢。適用於地理位置索引、附近位置查詢、位置跟蹤等。
-
流(Stream):
- 適用場景:流數據結構是 Redis 5.0 版本引入的,適用於構建消息隊列、實現時間序列數據模型、提供持久化消息隊列功能等。
每種數據結構都有其特定的命令集來操作,可以根據實際業務需求選擇合適的數據結構來優化性能和存儲效率。在實際應用中,有時候也會將多種數據結構組合使用,以滿足更復雜的業務邏輯。