在redis cluster集群模式下,所有的数据会根据键名计算hash,决定数据分配的哈希槽(hash slot)的位置。redis cluster模式固定有16384个hash slot。
关于redis cluster模式的介绍参考:redis服务运行模式
一、数据分片
- 将key使用CRC16算法进行计算,然后取余16384,得到所在哈希槽位置
- 哈希槽从0开始计数,例如:0~16383
- 公式:哈希槽 = crc16(key) % 16384
- 每个集群节点自动分配部分哈希槽,假设有3个集群节点,则每个集群节点分配5461个哈希槽
二、哈希标签(hash tag)
2.1 使用
哈希标签可以让不同的key分配到同一槽下,使用花括号{}包裹,例如:
- key:{group} 那么将使用group的内容计算hash
- key:{group}:user_id 也只使用group的内容计算hash
- key:{group}:{user_id} 只使用第一个花括号的内容,所以也只使用group的内容计算hash
- {key}:group 使用key的内容计算hash
- key:group:user_id 没有使用hash tag,使用key:group:user_id的内容计算hash
2.2 设置和验证
连接到任意一台主节点
1 | redis-cli -c -p 7001 |
使用下面命令得到所在hash slot
1 | CLUSTER KEYSLOT user:{group1}:111 |

三、注意点
- 一般情况下,不允许同时操作不同槽的key,例如下面操作:
如果key1和key2在不同槽,会出现:(error) CROSSSLOT Keys in request don’t hash to the same slot
1 | MGET key1 key2 |
- 如果某个key存在大量写操作,并且使用了hash tag,那可能会造成单过载,分配不均衡问题。这种问题要在设计缓存前考虑
- 是否必须使用hash tag
- 细分hash tag的内容
- 本文作者: 暮秋人
- 本文链接: https://muqiuren.pages.dev/2025/02/redis-data-sharking/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!