更新时间: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
父主题: Redis使用