[转帖]redis集群报错CROSSSLOT Keys in request don‘t hash to the same slot
先上结果:
$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,会被分到相同的 slotfoo{}{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也不能解决这个问题,只能暂时用笨办法一个一个循环插入了。
总结完毕 收工结束!
[转帖]redis集群报错CROSSSLOT Keys in request don‘t hash to the same slot的更多相关文章
- redis集群报错
写入redis集群报错:(error) MOVED 6918 解决方法:redis-cli -c -p 7001 -h 10.0.0.104
- redis集群报错:(error) CLUSTERDOWN Hash slot not served
百度上坑太多,如果你遇到搭建redis集群的时候出现这个错误在百度上找到解决办法基本上都是坑. 首先集群搭建完成后,你肯定去登陆redis进行测试 1.redis01/redis-cli -h &qu ...
- redis集群报错:(error) CLUSTERDOWN The cluster is down
更换了电脑,把原来的电脑上的虚拟机复制到了新电脑上,启动虚拟机上的centos系统,然后启动redis集群(redis5版本),发现集群可以启动,redis进程也有,但是连接集群中的任意节点就报错,如 ...
- maven项目中使用redis集群报错: java.lang.NumberFormatException: For input string: "7001@17001"
解决:由于redis集群的采用的版本是2.7的,在maven的pom.xml中将jedis的版本改成2.9的就可以了
- maven项目中使用redis集群报错: java.lang.NumberFormatException: For input string: "7006@17006"
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [redis.client ...
- redis集群报错:(error) MOVED 11469 192.168.163.249:7002
应该是你没有启动集群模式(即缺少了那个"-c"): redis-cli -c -h yourhost -p yourpost
- redis集群报错,(error) MOVED 15495 127.0.0.1:7003
节点会对命令请求进行分析和key的slot计算,并且会查找这个命令所要处理的键所在的槽.如果要查找的哈希槽正好就由接收到命令的节点负责处理, 那么节点就直接执行这个命令. 另一方面, 如果所查 ...
- redis集群报错:(error) MOVED 5798 127.0.0.1:7001
原因 这种情况一般是因为启动redis-cli时没有设置集群模式所导致. 解决方案 启动时使用-c参数来启动集群模式,命令如下: redis-cli -c -p 7000 测试 127.0.0.1:7 ...
- Redis创建集群报错
Redis创建集群报错: 1:任何一个集群节点中都不能存在数据,如果有备份一下删除掉aof文件或rdb文件 2: nodes-集群端口.conf 文件存的会有报错记录,所以该文件也要删除
- 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内存的阿里云服务器 ...
随机推荐
- Caffeine Cache缓存
SpringBoot 集成 Caffeine Caffeine 和 Spring Cache 依赖,使用注解方法实现缓存 依赖 <!--提供 Spring Boot 中的缓存支持--> & ...
- Python实用技巧:将 Excel转为PDF
将Excel文件转换为PDF可以方便储存表格数据,此外在打印或共享文档时也能确保表格样式布局等在不同设备和操作系统上保持一致.今天给大家分享一个使用第三方Python库Spire.XLS for Py ...
- 带你认识一下多模态对比语言图像预训练CLIP
本文分享自华为云社区<多模态对比语言图像预训练CLIP:打破语言与视觉的界限>,作者:汀丶. 一种基于多模态(图像.文本)对比训练的神经网络.它可以在给定图像的情况下,使用自然语言来预测最 ...
- that the pod didn't tolerate, 2 Insufficient cpu.
K8S Pod 一直处于 Pending 状态 有几个原因可以阻止 Pod 运行,但我们将描述三个主要问题: 调度问题:无法在任何节点上调度 Pod. 镜像问题:下载容器镜像时出现问题. 依赖性问题: ...
- python-docx -快速入门
docx python-docx是一个用于创建和更新Microsoft word(.docx)文件的Python库 安装 pip install python-docx 快速入门 打开文档 需要的 ...
- springboot 整合 ehcahe后,实现缓存数据 应用关闭时序列化(磁盘持久化),重启再加载
ehcache使用很长时间了,但是却没有用到缓存数据序列化(C#中是这么个说法)与再加载.这次因为业务中需要对缓存数据进行临时存储并再加载使用,实现该功能的方式多种多样.既然ehcache有磁盘保存机 ...
- Latex公式排版问题总结
Latex写博客和论文,因为有模板,所以用起来还是很方便的. 但是在实际使用中,由于论文是双栏的,因此比较长的公式在排版时会比较困难.下面对Latex中的公式排版方法做一些记录. Latex公式排版( ...
- 将Sublime Text打造为轻量级的C++ IDE
本文较为详细地介绍了在Windows系统下,如何配置Sublime Text的C++编译运行环境.目前实现了了可以在Sublime Text按下快捷键后,调出CMD或者终端来运行C/C++程序,从而解 ...
- 叮~OpenSCA社区拍了拍您并发来一份开源盛会邀请函
2023数字供应链安全大会(DSS 2023)将于8月10日在北京·国家会议中心举办.本次大会以"开源的力量"为主题,由悬镜安全主办,ISC互联网安全大会组委会.中国软件评测中心( ...
- 深度学习降噪专题课:实现WSPK实时蒙特卡洛降噪算法
大家好~本课程基于全连接和卷积神经网络,学习LBF等深度学习降噪算法,实现实时路径追踪渲染的降噪 本课程偏向于应用实现,主要介绍深度学习降噪算法的实现思路,演示实现的效果,给出实现的相关代码 线上课程 ...