先上结果:

$redis->sDiffStore('live_room:robots:data:' . $info['id'], 'user_info:robots_list', '');

上述代码执行后redis抛出一个异常。来看redis源码是如何抛出这个异常的(附redis源码地址:redis/cluster.c at 5.0 · redis/redis · GitHub):

CLUSTER_REDIR_CROSS_SLOT 这个异常,继续定位:

这里已经说的很明白了,如果一个redis请求操作了多个Key,并且key不在同一个slot下,就会出现这个异常,来看源码的实现:

问题很好定位,解决的话我是放弃了redis提供的方法,自己将key1的内容拿出来,利用协程去将这些数据跑到新key下,此举在数据量大的情况下是否合适另说,紧急情况下解决问题为主。

通过这个问题明确几个概念:

1. redis 集群的 slot :

redis 集群中的 key 空间被划分为 16384 个 hash slot,节点数量也被限制为最多16384个(建议1000以内)。每个节点负责一部分的 hash slot,key 划分到 hash slot的规则如下:

HASH_SLOT = CRC16(key) mod 16384

hash slot 最大的作用应该就是提高扩展性了,可以很好地帮助集群的横向伸缩,增减节点时只需要将节点上的 slot 转移到其他节点。

2. 哪些操作会被限制:

集群模式,一次请求,涉及多个key。

  • 多 key 命令:mset mget sDiffStore sUnionStore 等
  • 多 key 的事务(MULTI)
  • 多 key 的Lua脚本

3. 出现环境:

据说!是据说啊!!!我没有证据。

Redis Enterprise 没有这个问题,只是开源版有这个问题

4. 解决办法:

hash tag

-------------------------------------------------------虚线以内部分为摘录

hash tag 可以影响 hash slot 的生成,相同 hash tag 的 key 会被分配到相同的 hash slot。hash tag使用 {...} 形式。对于包含 hash tag 的 key,redis只会对 {} 内的字符串计算 hash,从而相同 hash tag 的 key 会计算得到相同的 hash slot。

一个有效的 hash tag 应该是key中首个 { 和首个 }(在首个 { 之后) 之间有字符存在。

示例:

  • {user1000}.following、 {user1000}.follower 有相同 hash tag,会被分到相同的 slot
  • foo{}{bar} 没有有效的 hash tag,会按照 foo{}{bar} 进行 hash 计算
  • foozap 有有效的 hash tag,会按照 {bar 进行 hash 计算
  • foo{bar}{zap} 有有效的 hash tag,会按照 bar 进行 hash 计算

注意,hash tag 要合理使用,避免大量的 key 被分配到相同 slot 里导致数据存储和访问倾斜。

-------------------------------------------------------虚线以内部分为摘录

可见,hash tag可以使那些key中有相同且固定字符串的key最终被分配到同一个hash slot中,这样从数据源头上避免了跨slot操作的问题,但是不能滥用,并且需要在一开始的代码结构设计中就要考虑到这个问题,不然就像我上述出问题的代码,多个key是完全不同的,在不变key的情况下,即使有hash tag也不能解决这个问题,只能暂时用笨办法一个一个循环插入了。

总结完毕   收工结束!

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树首页概览52178 人正在系统学习中

[转帖]redis集群报错CROSSSLOT Keys in request don‘t hash to the same slot的更多相关文章

  1. redis集群报错

    写入redis集群报错:(error) MOVED 6918 解决方法:redis-cli -c -p 7001 -h 10.0.0.104

  2. redis集群报错:(error) CLUSTERDOWN Hash slot not served

    百度上坑太多,如果你遇到搭建redis集群的时候出现这个错误在百度上找到解决办法基本上都是坑. 首先集群搭建完成后,你肯定去登陆redis进行测试 1.redis01/redis-cli -h &qu ...

  3. redis集群报错:(error) CLUSTERDOWN The cluster is down

    更换了电脑,把原来的电脑上的虚拟机复制到了新电脑上,启动虚拟机上的centos系统,然后启动redis集群(redis5版本),发现集群可以启动,redis进程也有,但是连接集群中的任意节点就报错,如 ...

  4. maven项目中使用redis集群报错: java.lang.NumberFormatException: For input string: "7001@17001"

    解决:由于redis集群的采用的版本是2.7的,在maven的pom.xml中将jedis的版本改成2.9的就可以了

  5. maven项目中使用redis集群报错: java.lang.NumberFormatException: For input string: "7006@17006"

    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [redis.client ...

  6. redis集群报错:(error) MOVED 11469 192.168.163.249:7002

    应该是你没有启动集群模式(即缺少了那个"-c"): redis-cli -c -h yourhost -p yourpost

  7. redis集群报错,(error) MOVED 15495 127.0.0.1:7003

        节点会对命令请求进行分析和key的slot计算,并且会查找这个命令所要处理的键所在的槽.如果要查找的哈希槽正好就由接收到命令的节点负责处理, 那么节点就直接执行这个命令. 另一方面, 如果所查 ...

  8. redis集群报错:(error) MOVED 5798 127.0.0.1:7001

    原因 这种情况一般是因为启动redis-cli时没有设置集群模式所导致. 解决方案 启动时使用-c参数来启动集群模式,命令如下: redis-cli -c -p 7000 测试 127.0.0.1:7 ...

  9. Redis创建集群报错

    Redis创建集群报错: 1:任何一个集群节点中都不能存在数据,如果有备份一下删除掉aof文件或rdb文件 2: nodes-集群端口.conf 文件存的会有报错记录,所以该文件也要删除

  10. quartz集群报错but has failed to stop it. This is very likely to create a memory leak.

    quartz集群报错but has failed to stop it. This is very likely to create a memory leak. 在一台配置1核2G内存的阿里云服务器 ...

随机推荐

  1. POJ 3003 DP 寻路 记录路径

    POJ 3003 DP 寻路 记录路径 我一开始把M看成是每个a_i的上限了,这是致命的,因为这个题dfs暴力搜索+剪枝是过不了的因为M<=40,全部状态有2的四十次幂. 正解是DP,设dp[i ...

  2. EDS从小白到专家丨打造数据交换的六边形卫士,让你的数据你做主

    本文分享自华为云社区<[EDS从小白到专家]第4期:打造数据交换的六边形卫士,让你的数据你做主>,作者: 开天aPaaS小助手 . 你还在担心数据共享后一旦"失控"将爆 ...

  3. 云图说|图解制品仓库CodeArts Artifact

    摘要:制品仓库用于存放由源码编译生成的.可运行的二进制文件,重要作用是实现制品文件的可信存储,支撑软件开发活动. 本文分享自华为云社区<[云图说]第277期 图解制品仓库CodeArts Art ...

  4. 认识一下MRS里的“中间人”Alluxio

    摘要:Alluxio在mrs的数据处理生态中处于计算和存储之间,为上层spark.presto.mapredue.hive计算框架提供了数据抽象层,计算框架可以通过统一的客户端api和全局命名空间访问 ...

  5. 利用Appuploader上架IPA步骤

      Appuploader可以辅助在Windows.linux或mac系统直接申请iOS证书p12,及上传ipa到App Store.方便在没有苹果电脑情况下上架IPA操作. 一.下载安装iOS上架辅 ...

  6. CNCF即将推出平台成熟度模型丨亮点导览

    今年年初,云原生计算基金会(CNCF)发布了平台白皮书(点击这里查看中文版本).白皮书描述了云计算内部平台是什么,以及它们可以为企业提供的价值. 为了进一步挖掘平台对企业的价值,为企业提供一个可以评估 ...

  7. Java 图片、文件 Base64 互转

    Java 图片.文件 Base64 互转 package com.thoth.his.base.util; import java.io.FileInputStream; import java.io ...

  8. Nacos 服务状态监听四种写发

    监听服务的四种实现方式,以监听 Nacos 服务为例 1. 传统方式 public void subscribe() { try { NamingService namingService = Nam ...

  9. ChatGPT带你入门机器学习:逻辑回归模型博客和小红书风格文案一次搞定!

    打脸了 顺手向大家演示一下如何用 ChatGPT 写技术博客吧,其实蛮简单的,特别需要操心的是它会一本正经的胡说八道,还信誓旦旦的.我们要审查它的回答,万不可全信. 为了便于阅读,我把prompt加粗 ...

  10. POJ 2484博弈——对称法

    题目链接:http://poj.org/problem?id=2484 题意:Alice和Bob玩游戏,从一堆圆环形排列的硬币中拿硬币,每次可以拿一个或者两个,但必须拿连续的(两个中间有空位也视为不连 ...