Redis集羣報錯:(error) CROSSSLOT Keys in request don't hash to the same slot 的解決辦法

例如:mset 設置多鍵值時報錯

172.100.0.1:6393> MSET name1 '1' name2 '2' name3 '3' name4 '4'
(error) CROSSSLOT Keys in request don't hash to the same slot

解決辦法:用相同的hashTag設置

172.100.0.1:6391> mset {t}test1 wang {t}test2 zhao {t}test3 liu
-> Redirected to slot [15891] located at 172.100.0.1:6393
OK
172.100.0.1:6393> mget {t}test1
1) "wang"
172.100.0.1:6393> mget {t}test1 {t}test2 {t}test3
1) "wang"
2) "zhao"
3) "liu"
172.100.0.1:6393> 

其他參考:

Redis 哈希槽基本概念

哈希槽(hash slot)是來自Redis Cluster的概念, 但在各種集羣方案都有使用。

哈希槽是一個key的集合,Redis集羣共有16384個哈希槽,每個key通過CRC16散列然後對16384進行取模來決定該key應當被放到哪個槽中,集羣中的每個節點負責一部分哈希槽。

以有三個節點的集羣爲例:

節點A包含0到5500號哈希槽
節點B包含5501到11000號哈希槽
節點C包含11001到16384號哈希槽
這樣的設計有利於對集羣進行橫向伸縮,若要添加或移除節點只需要將該節點上的槽轉移到其它節點即可。
在某些集羣方案中,涉及多個key的操作會被限制在一個slot中,如Redis Cluster中的mget/mset操作。
HashTag
HashTag機制可以影響key被分配到的slot,從而可以使用那些被限制在slot中操作。

HashTag即是用{}包裹key的一個子串,如{user:}1, {user:}2。

在設置了HashTag的情況下,集羣會根據HashTag決定key分配到的slot, 兩個key擁有相同的HashTag:{user:}, 它們會被分配到同一個slot,允許我們使用MGET命令。

通常情況下,HashTag不支持嵌套,即將第一個{和第一個}中間的內容作爲HashTag。若花括號中不包含任何內容則會對整個key進行散列,如{}user:。

HashTag可能會使過多的key分配到同一個slot中,造成數據傾斜影響系統的吞吐量,務必謹慎使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章