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槽了。

相关推荐
NCIN EXPE4 小时前
redis 使用
数据库·redis·缓存
hERS EOUS4 小时前
nginx 代理 redis
运维·redis·nginx
NoSi EFUL6 小时前
redis存取list集合
windows·redis·list
Deepincode6 小时前
Redis源码探究系列—SDS 扩容策略与内存预分配机制
redis
程序员老邢7 小时前
【技术底稿 19】Redis7 集群密码配置 + 权限锁死 + 磁盘占满连锁故障真实排查全记录
java·服务器·经验分享·redis·程序人生·微服务
coNh OOSI8 小时前
Redis——Windows安装
数据库·windows·redis
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.9 小时前
Redis主从复制配置全攻略
数据库·redis·笔记
csdn2015_9 小时前
修改分类信息的时候将分类异步写入redis
数据库·redis·bootstrap
woniu_buhui_fei9 小时前
Redis知识整理二
数据库·redis·缓存
untE EADO10 小时前
redis的下载和安装详解
数据库·redis·缓存