Redis集群报错:(error) CROSSSLOT Keys in request don't hash to the same slot 的解决办法

忘是亡心i 2023-07-21 05:29 12阅读 0赞

例如:mset 设置多键值时报错

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

解决办法:用相同的hashTag设置

  1. 172.100.0.1:6391> mset { t}test1 wang { t}test2 zhao { t}test3 liu
  2. -> Redirected to slot [15891] located at 172.100.0.1:6393
  3. OK
  4. 172.100.0.1:6393> mget { t}test1
  5. 1) "wang"
  6. 172.100.0.1:6393> mget { t}test1 { t}test2 { t}test3
  7. 1) "wang"
  8. 2) "zhao"
  9. 3) "liu"
  10. 172.100.0.1:6393>

其他参考:

Redis 哈希槽基本概念
  1. 哈希槽(hash slot)是来自Redis Cluster的概念, 但在各种集群方案都有使用。
  2. 哈希槽是一个key的集合,Redis集群共有16384个哈希槽,每个key通过CRC16散列然后对16384进行取模来决定该key应当被放到哪个槽中,集群中的每个节点负责一部分哈希槽。
  3. 以有三个节点的集群为例:
  4. 节点A包含05500号哈希槽
  5. 节点B包含550111000号哈希槽
  6. 节点C包含1100116384号哈希槽
  7. 这样的设计有利于对集群进行横向伸缩,若要添加或移除节点只需要将该节点上的槽转移到其它节点即可。
  8. 在某些集群方案中,涉及多个key的操作会被限制在一个slot中,如Redis Cluster中的mget/mset操作。
HashTag
  1. HashTag机制可以影响key被分配到的slot,从而可以使用那些被限制在slot中操作。
  2. HashTag即是用{}包裹key的一个子串,如{user:}1, {user:}2
  3. 在设置了HashTag的情况下,集群会根据HashTag决定key分配到的slot 两个key拥有相同的HashTag:{user:}, 它们会被分配到同一个slot,允许我们使用MGET命令。
  4. 通常情况下,HashTag不支持嵌套,即将第一个{和第一个}中间的内容作为HashTag。若花括号中不包含任何内容则会对整个key进行散列,如{}user:。
  5. HashTag可能会使过多的key分配到同一个slot中,造成数据倾斜影响系统的吞吐量,务必谨慎使用。

发表评论

表情:
评论列表 (有 0 条评论,12人围观)

还没有评论,来说两句吧...

相关阅读