生产环境是集群Redis,尝试对一个key进行rename,提示如下: CROSSSLOT Keys in request don‘t hash to the same slot. 原因是:rename 需要把oldkey 名字重置为 newkey,但oldkey 和 newkey不在同一个hash slot
在某些集群方案中,涉及多个key的操作会被限制在一个slot中,如mget/mset,rename操作. Redis 集群的键空间被分割为 16384 个槽(slot), 集群的最大节点数量也是 16384 个。 每个Key都会经过CRC16计算散列到固定的槽位中,对于多个键,仅当它们都共享相同的连接插槽时才执行
HashTag机制可以影响key被分配到的slot,从而可以使用那些被限制在slot中操作。
HashTag即是用{}包裹key的一个子串,如{user:}1, {user:}2。
在设置了HashTag的情况下,集群会根据HashTag决定key分配到的slot, 两个key拥有相同的HashTag:{user:}, 它们会被分配到同一个slot,允许我们使用MGET命令。
通常情况下,HashTag不支持嵌套,即将第一个{和第一个}中间的内容作为HashTag。若花括号中不包含任何内容则会对整个key进行散列,如{}user:。
HashTag可能会使过多的key分配到同一个slot中,造成数据倾斜影响系统的吞吐量,务必谨慎使用。
有一组key,前缀为 precise_, 后缀为 1~100的数字. Redis中已经导入了 precise_1 ~ precise_100 100个key,现需要重新设置这个100key的值,可按如下步骤:
参考文章:
本文作者:shining_finger
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!