
# 如何分散集群实例中的key
在Redis集群中，数据是根据键的哈希值分配到不同的节点上的。Redis集群使用哈希槽（hash slots）来实现数据的分布，总共有16384个哈希槽。每个键通过哈希函数映射到一个哈希槽，然后根据槽的分配情况分配到相应的节点。
如果发现某些键都集中到了一个节点上，可能是因为键的命名模式导致它们映射到了同一个哈希槽。为了避免这种情况，可以采取如下方法来分散键。
#### 分散集群实例中的key
1. **使用哈希标签（Hash Tags）**
   ![](https://support.huaweicloud.com/dcs_faq/public_sys-resources/note_3.0-zh-cn.png)
   哈希标签可以有效分散键，但需要确保键的逻辑一致性。
   Redis允许在键中使用哈希标签来控制键的分布。哈希标签是键中用{}括起来的部分，Redis在计算哈希值时只考虑这部分内容。
   **示例：**
   例如有以下键：
   ```
   user:1 user:2 user:3
   ```
   这些键可能会被分配到同一个哈希槽。为了避免这种情况，可以使用哈希标签：
   ```
   user:{1} user:{2} user:{3}
   ```
   这样，Redis会根据{1}、{2}、{3}来计算哈希值，从而分散到不同的槽。
   
2. **随机化键名**
   ![](https://support.huaweicloud.com/dcs_faq/public_sys-resources/note_3.0-zh-cn.png)
   随机化键名可能会增加键的复杂性，但可以有效分散负载。
   如果无法使用哈希标签，可以通过在键名中添加随机字符串或UUID来分散键。
   **示例：**
   ```
   import uuid
   def generate_key(base_key):
       random_part = str(uuid.uuid4())[:8]  # 生成8位随机字符串
       return f"{base_key}:{random_part}"
   # 使用
   key = generate_key("user")
   print(key)  # user:123e4567
   ```
   这样，每个键都会有一个随机的部分，从而分散到不同的哈希槽。
   
3. **使用不同的键前缀**
   如果键名模式比较固定，可以通过添加不同的前缀来分散键。
   **示例：**
   ```
   user:1 -> user1:1 
   user:2 -> user2:2 
   user:3 -> user3:3
   ```
   这样，每个键的前缀不同，哈希值也会不同。
   
 
#### 如何查询槽的分布情况
使用CLUSTER INFO和CLUSTER KEYSLOT命令查看槽的分布情况。
**示例：**
```
redis-cli -c -h <node_ip> -p <node_port> CLUSTER INFO 
redis-cli -c -h <node_ip> -p <node_port> CLUSTER KEYSLOT <key>
```
