
# hashtag的原理、规则及用法示例
#### hashtag原理
单实例上的mset、lua脚本等处理多key时，是一个原子性(atomic)操作，所有给定key都会在同一时间内被执行。集群每次通过对key进行hash计算到不同的分片，所以集群上同时执行多个key，不再是原子性操作，会存在某些给定 key 被更新而另外一些给定key没有改变的情况，其原因是需要设置的多个key可能分配到不同的机器上。因此集群引入了hashtag来对多key同时操作，在设置了hashtag的情况下，集群会根据hashtag决定key分配到的slot， 当两个key拥有相同的hashtag时, 它们会被分配到同一个slot。
#### hashtag使用规则
第一次出现"{"和接下来第一次出现的"}"之间有内容。
例如：
- 这两个键{user1000}.following和{user1000}.followers由于只有一对{}，将user1000来计算hash。
- 对于键foo{}{bar}，整个键foo{}{bar}将像往常一样计算hash，因为第一次出现的"{"后面跟"}"中间没有字符。
- 对于键foo{{bar}}zap，子字符串{bar将被计算hash，因为它是第一次出现"{"和第一次出现"}"之间的子字符串。
- 对于键foo{bar}{zap}的子字符串bar将被计算hash，因为只使用第一个"{"和"}"。
 
#### hashtag用法示例
当如下操作时：
```
EVAL "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2])" 2 key1 key2 value1 value2
```
出现以下报错：
ERR 'key1' and 'key2' not in the same slot
可通过hashtag进行解决：
```
EVAL "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2])" 2 {user}key1 {user}key2 value1 value2
```
