Redis 哈希槽的概念,到底是什麼?是一個表的表名就會佔用一個哈希槽?
最近在學習Redis,3.0用了哈希槽的概念,而沒有用一致性哈希演算法,不都是哈希么?這樣做的原因是為什麼呢?你為了動態增刪節點的時候,不至於丟失數據么?
還有集群總共有2的14次方,16384個哈希槽,那麼每一個哈希槽中存的key 和 value是什麼?我現在理解是,有一個表名是 user_info_10001,value 就是表裡的數據,那麼user_info_10001這個key_value就佔據了一個槽?這樣想不對啊,我如果是很多用戶,怎麼可能只有16348個?所以,我理解肯定是錯的,但是我不知道具體的哈希槽裡面存的到底是什麼,跪求大神啊
"用了哈希槽的概念,而沒有用一致性哈希演算法,不都是哈希么?這樣做的原因是為什麼呢?"
Redis Cluster是自己做的crc16的簡單hash演算法,沒有用一致性hash。Redis的作者認為它的crc16(key) mod 16384的效果已經不錯了,雖然沒有一致性hash靈活,但實現很簡單,節點增刪時處理起來也很方便。
"為了動態增刪節點的時候,不至於丟失數據么?"
節點增刪時不丟失數據和hash演算法沒什麼關係,不丟失數據要求的是一份數據有多個副本。「還有集群總共有2的14次方,16384個哈希槽,那麼每一個哈希槽中存的key 和 value是什麼?」
當你往Redis Cluster中加入一個Key時,會根據crc16(key) mod 16384計算這個key應該分布到哪個hash slot中,一個hash slot中會有很多key和value。你可以理解成表的分區,使用單節點時的redis時只有一個表,所有的key都放在這個表裡;改用Redis Cluster以後會自動為你生成16384個分區表,你insert數據時會根據上面的簡單演算法來決定你的key應該存在哪個分區,每個分區里有很多key。
感覺你還剛入門概念不是很清楚,可以先去看看文檔:Redis Cluster Specification - Redis里的「Keys distribution model」有詳細描述,中文文檔也有:Redis分散式部署,一致性hash;分散式與緩存隊列_精品文庫_IThao123 - IT行業第一站redis 先通過CRC16演算法 算出 這個鍵 應該位於哪個槽中
def slot_number(key):
return CRC16(key) 16383
你所理解的 哈希槽 ,可以理解為 鍵為 1-16383,值為 表示節點信息的結構體對象(clusterNode),這樣就可以知道這個 鍵應該交給哪個節點處理。
//clusterNode 部分信息
#define CLUSTER_SLOTS 16384
typedef struct clusterNode {
//char為8位, 通過數組位位置是否為1判斷是否屬於該節點處理
unsigned char slots[CLUSTER_SLOTS/8]; /*槽佔用信息*/
int numslots; /* 該節點處理的槽數量 */
char ip[NET_IP_STR_LEN]; /* ip地址 */
int port; /* 埠*/
} clusterNode;
推薦閱讀:
※SSDB 和 Redis 的優缺點各位哪些?
※redis的安裝和分散式配置簡潔教程
※Redis內部數據結構詳解(4)——ziplist
TAG:Redis |