上线踩坑---redis受限命令与阻塞队列

本文探讨了在Redis集群环境下,受限命令的原因和解决方案,特别是针对多key命令如brpoplpush的问题。文章指出,由于Redis的单线程特性,处理阻塞命令时,使用EventLoop机制确保不阻断其他client操作。同时,提到了解决受限命令的方法,如使用hash tag确保keys位于同一slot。
摘要由CSDN通过智能技术生成

1.受限命令

2021.01.14上线时,同事遇到的问题:brpoplpush命令在上线时报错:
在这里插入图片描述

1.1 原因

之前在测试环境测的时候redis都是单节点部署,没有问题;但是在生产环境上,是redis cluster,对于多key的命令,会有命令限制。

hash slot是存放key的,redis cluster共有16384个slots, CRC16(key) % 16384 来计算键 key 属于哪个slot。如一个集群有三个哈希槽, 其中:

节点 A 负责处理 0 号至 5500 号哈希槽。
节点 B 负责处理 5501 号至 11000 号哈希槽。
节点 C 负责处理 11001 号至 16384 号哈希槽。

有个key 是my_name,CRC16(‘my_name’)%16384 = 2412,它被分到节点A上。

如果是单节点的redis,所有的slots都在一个节点上当然没什么问题;但是是cluster的话,保证原子操作的多keys命令,会因为操作的多keys不在一个slot受到限制,如果keys在不同的slots,甚至可能在不同的节点上,我自己感觉:很难保证原子性,调度起来的资源损耗得不偿失,所以就直接进行限制了。

1.2 解决

1.替换多key操作呗,就是不好保证原子性了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值