redis - 单分片 Redis Cluster 怎么会报 CROSSSLOT 错误?
问题描述
我不明白只有一个分片的 Redis 集群如何导致 CROSSSLOT 错误。根据文档,当您发出影响多个键的命令时会发生此错误,这些键并非都驻留在同一个哈希槽中(即分片环境中的节点)。鉴于单个分片只有一个插槽;0-16383 - 以及所有的数据 - 这怎么会发生?
就我而言,我有一个带有一个只读副本(从属)的分片。
我通过使用这里解释的哈希标签来规避这个问题:https ://redis.io/topics/cluster-spec - 但是这并没有回答这个问题。
这是集群节点的输出:
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
解决方案
这也让我很困惑。Redis 代码要求密钥散列到同一个插槽(而不是同一个节点),我不明白为什么会这样,因为集群规范说以下(强调我的):
Redis Cluster 实现了 Redis 的非分布式版本中可用的所有单键命令。执行复杂的多键操作的命令,如 Set 类型联合或交集,只要键都属于同一个节点,就可以实现。
我在 GH 上打开了一个问题:https ://github.com/antirez/redis/issues/5118
推荐阅读
- laravel - 单一 API 用于经过身份验证的用户和来宾用户
- mysql - 如何优化这个查询(PDO+MYSQL)
- java - java.io.IOException: Can't write react-native run-android failed
- powershell - 如何使用powershell脚本将键盘快捷键传递给命令提示符
- android - 为班级的所有孩子提供匕首
- python - Py.test:如何在某些值应返回错误时进行参数化
- python-3.x - 如何修复诸如 T&C 之类的标记短语被拆分为 'T' '&' 'C'
- java - JBoss - 如何在多数据库环境中设置默认数据源?
- excel - 有没有办法在UTC格式的excel“一般”单元格中添加一天?
- spring - Spring数据@Transaction没有按顺序执行