上文说到,通过可以操作redis lua脚本来实现时间窗限流,在执行lua脚本的时候,参数中有个keys列表,当lua脚本中如果有操作多个key的情况,就可以传个key列表了。的异常。原因在于redis为了保持事务,同一个lua脚本访问应该访问同一个slot(hash槽),但是redis集群会根据 key 进行 hash 并对 16384 取模,因此如果采用默认hash的话,那么就可能会产生上述的错误。
上文说到,通过 可以操作redis lua脚本来实现时间窗限流,在执行lua脚本的时候,参数中有个keys列表,当lua脚本中如果有操作多个key的情况,就可以传个key列表了。通常情况下,这可能不会有什么问题,但如果redis是集群部署的,传多个key可能会收到:command keys must in same slot
的异常。
原因在于redis为了保持事务,同一个lua脚本访问应该访问同一个slot(hash槽),但是redis集群会根据 key 进行 hash 并对 16384 取模,因此如果采用默认hash的话,那么就可能会产生上述的错误。

解决办法:

可以指定redis key用于计算hash的部分字符串,比如我有两个key,分别是lock:globalkey和lock:prikey,默认会将整个key拿去计算hash值,很显然,hash不可能一样。如果要让这两个key处于同一个hash槽,我们可以将key的公共部分提取出来用于hash计算,redis支持的格式是用{}
包裹这部分字符串,官网把被{}
包裹的这部分叫做 hash tag。
那么上面两个key就可以这么设计:{lock}:globalkey 和 {lock}:prikey。把 lock
字符串作为key的hash tag, 这样就能保证这两个key在redis中处于同一个hash槽了。
相关文章:
-
一个简化的Faas系统分为APIServer,Scheduler,ResourceManager,NodeService,ContainerService 5个组件,本题目中API…
-
那么在检查点保存的时候,系统故障,保存检查点失败,那么恢复检查点的时候,恢复的是上次成功保存检查点的数据偏移量,如果不对新数据进行保护,可能就会把之前有可能。…
-
前言日常开发中,秒杀下单、抢红包等业务场景,都需要使用分布式事务、分布式锁等技术来保证数据最终一致性。有时我们需要保证某一方法同一时刻只能被一个线程执行,这时就需要用到分布式锁。在…
-
-
实例3:删除redis镜像实例4:删除 redis 5.0 版本的镜像。…
-
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论