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使用 所有常见问题
- 是否支持CPU架构的变更?
- 实例是否支持变更可用区
- Redis实例能否修改VPC和子网?
- 实例是否支持自定义或修改端口?
- 实例是否支持修改访问地址?
- 实例无法删除是什么原因?
- 集群实例启动时间过长是什么原因?
- 使用redis_exporter出错怎么办?
- 什么是预留内存,如何配置预留内存?
- 创建的缓存实例为什么可使用内存比实例规格少一些?
- Redis 3.0 Proxy集群不支持redisson分布式锁的原因
- DCS Redis有没有后台管理软件?
- DCS缓存实例的数据被删除后,能否找回?
- 为什么实例实际可用内存比申请规格小而且已使用内存不为0?
- 如何查看Redis内存占用量
- Cluster集群实例容量和性能未达到瓶颈,但某个分片容量或性能已过载是什么原因?
- 访问Redis报OOM错误提示
- 不同编程语言如何使用Cluster集群客户端
- 使用Cluster的Redis集群时建议配置合理的超时时间
- 读取redis数据报超时错误
- hashtag的原理、规则及用法示例
- Redis key丢失是什么原因
- 重启实例后缓存数据会保留吗?
- 如何确认实例是单DB还是多DB
- Proxy集群使用多DB限制
- 如何创建多DB的Proxy集群实例?
more