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操作呗,就是不好保证原子性了