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

相关推荐

  1. 通过lua脚本redis处理json数据

    2024-03-30 11:00:04       42 阅读
  2. Lua脚本Redis的高效应用

    2024-03-30 11:00:04       53 阅读

最近更新

  1. Rust入门实战 编写Minecraft启动器#2建立资源模型

    2024-03-30 11:00:04       1 阅读
  2. three.js利用着色器实现波浪效果

    2024-03-30 11:00:04       1 阅读
  3. Python pdfplumber库:轻松解析PDF文件

    2024-03-30 11:00:04       1 阅读
  4. 【必读】HTML中的BFC:10个你不知道的惊人事实

    2024-03-30 11:00:04       1 阅读

热门阅读

  1. 【Qt问题】Qt常用快捷键汇总

    2024-03-30 11:00:04       17 阅读
  2. 题目 1414: 最大的字母

    2024-03-30 11:00:04       18 阅读
  3. 诊断慢SQL根源

    2024-03-30 11:00:04       17 阅读
  4. Spring IoC 总结

    2024-03-30 11:00:04       19 阅读
  5. npm(Node Package Manager)

    2024-03-30 11:00:04       16 阅读
  6. 轮转数组 - LeetCode 热题 15

    2024-03-30 11:00:04       18 阅读
  7. 2024-3-28

    2024-03-30 11:00:04       13 阅读
  8. 347,前k个高频元素

    2024-03-30 11:00:04       20 阅读