单个shard Redis集群如何产生交叉插槽错误?

单个shard Redis集群如何产生交叉插槽错误?,redis,sharding,redis-cluster,Redis,Sharding,Redis Cluster,我不明白只有一个碎片的Redis集群如何会导致交叉插槽错误。根据文档,当您发出影响多个键的命令时会发生此错误,这些键并不都位于同一哈希槽中(即分片环境中的节点)。考虑到单个碎片只有一个插槽;0-16383-以及所有数据-这怎么可能发生 在我的例子中,我有一个具有一个读取副本(从)的单个碎片 我通过使用这里解释的散列标签来回避这个问题:-但是这并不能回答问题 这是群集节点的输出: e51c5f84e60116be3cb9d6734fc0c4deb1fde4c4 172.31.6.149:6379@

我不明白只有一个碎片的Redis集群如何会导致交叉插槽错误。根据文档,当您发出影响多个键的命令时会发生此错误,这些键并不都位于同一哈希槽中(即分片环境中的节点)。考虑到单个碎片只有一个插槽;0-16383-以及所有数据-这怎么可能发生

在我的例子中,我有一个具有一个读取副本(从)的单个碎片

我通过使用这里解释的散列标签来回避这个问题:-但是这并不能回答问题

这是群集节点的输出:

e51c5f84e60116be3cb9d6734fc0c4deb1fde4c4 172.31.6.149:6379@1122 slave c07ed67b7df1a9d4475702c944a43ad38c6954ba 0 1531143884198 1 connected
c07ed67b7df1a9d4475702c944a43ad38c6954ba 172.31.21.122:6379@1122 myself,master - 0 0 1 connected 0-16383
我可以像这样重现错误:

telnet 172.31.21.122 6379

SETEX redis-test-1 3600 whatever
+OK
SETEX redis-test-2 3600 whatever
+OK

KEYS redis-test*
*2
$12
redis-test-2
$12
redis-test-1

DEL redis-test-1 redis-test-2
-CROSSSLOT Keys in request don't hash to the same slot
考虑到单个碎片只有一个插槽;0-16383

这一个碎片拥有16384个插槽,每个插槽都是“单一的”…

这也让我感到困惑。需要将密钥散列到同一个插槽(而不是同一个节点),我不明白为什么会这样,因为

Redis Cluster实现了Redis非分布式版本中可用的所有单键命令。执行复杂多键操作(如集合类型并集或交集)的命令,以及所有键都属于同一节点的命令


我在《生长激素》杂志上发表了一篇文章:

,似乎是这样。插槽和碎片之间的差异让我感到困惑。我认为,在群集模式下,我们无法对不属于同一插槽的密钥执行多密钥操作的原因是,您无法确保这些密钥位于同一节点中。当然,在使用单个分片时总是这样,但是集群并不意味着只使用单个分片进行操作。您可能会突然将其一分为二,如果您对不再位于同一节点中的键执行多键操作,则会遇到问题。