lua脚本在redis集群中哈希槽分片问题

上文说到,通过用redis lua脚本实现时间窗分布式限流 可以操作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槽了。

相关推荐
学习中的码虫35 分钟前
c 中的哈希表
数据结构·哈希算法·散列表
Lion Long3 小时前
CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜
数据库·redis·mysql·缓存·腾讯云·codebuddy首席试玩官·codebuddy
柯南二号11 小时前
MacOS 用brew 安装、配置、启动Redis
redis
星星点点洲14 小时前
【Redis】RedLock实现原理
redis·缓存
我来整一篇14 小时前
用Redis的List实现消息队列
数据库·redis·list
加什么瓦14 小时前
Redis——数据结构
数据库·redis·缓存
lybugproducer15 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存
青山是哪个青山15 小时前
Redis 常见数据类型
数据库·redis·bootstrap
杨不易呀16 小时前
Java面试全记录:Spring Cloud+Kafka+Redis实战解析
redis·spring cloud·微服务·kafka·高并发·java面试·面试技巧