更新时间:2024-07-29 GMT+08:00

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