当前位置: 首页 > article >正文

集群架构中Lua脚本的限制以及出现的报错

在这里插入图片描述

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀

🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。

💡 无论你是刚刚踏入编程世界的新人,还是希望进一步提升自己的资深开发者,在这里都能找到适合你的内容。我们共同探讨技术难题,一起进步,携手度过互联网行业的每一个挑战

📣 如果你觉得我的文章对你有帮助,请不要吝啬你的点赞👍分享💕和评论哦! 让我们一起打造一个充满正能量的技术社区吧!


目录标题

  • 集群架构中Lua脚本的限制
  • Redis Cluster 架构限制具体错误码和原因请参见下表
    • 错误码分类
      • 具体示例
        • 1. 必须带有至少一个键
        • 2. 多个键必须属于同一个槽位
      • 总结


集群架构中Lua脚本的限制

  • 为了保证Lua执行的原子性,Lua命令不可拆分,只能在集群架构的一个DB分片上执行。通常会根据Key来决定路由到哪个DB分片执行,所以在集群架构中执行Lua命令时至少需要指定一个Key。如果读写多个Key,则同一个Lua脚本中的Key必须属于同一个Slot,否则会导致执行结果异常。对于KEYS、SCAN、FLUSHDB等无Key的命令,虽然能正常执行,但返回结果只包含单个分片的数据。上述限制由Redis Cluster架构导致。
  • 对单个节点执行SCRIPT LOAD命令时,不保证将该Lua脚本存入至其他节点中。

Redis Cluster 架构限制具体错误码和原因请参见下表

错误码分类

错误码说明
-ERR for redis cluster, eval/evalsha number of keys can't be negative or zero\r\n执行 Lua 脚本时必须带有至少一个键,代理会根据键决定将 Lua 脚本转发到哪个 DB 分片上执行。
-ERR 'xxx' command keys must in same slotLua 脚本中的多个键必须属于同一个槽位。

具体示例

1. 必须带有至少一个键

错误示例

EVAL "return redis.call('get', 'foo')" 0

错误码

-ERR for redis cluster, eval/evalsha number of keys can't be negative or zero\r\n

说明
执行 Lua 脚本时必须带有至少一个键,代理会根据键决定将 Lua 脚本转发到哪个 DB 分片上执行。

正确示例

EVAL "return redis.call('get', KEYS[1])" 1 fooeval

说明
这里指定了一个键 fooeval,代理会根据这个键将 Lua 脚本转发到相应的 DB 分片上执行。

2. 多个键必须属于同一个槽位

错误示例

EVAL "return redis.call('mget', KEYS[1], KEYS[2])" 2 foo foobar

错误码

-ERR 'mget' command keys must in same slot

说明
Lua 脚本中的多个键必须属于同一个槽位。在这个示例中,foofoobar 可能不在同一个槽位上,因此会报错。

正确示例

EVAL "return redis.call('mget', KEYS[1], KEYS[2])" 2 foo {foo}bar

说明
这里使用了哈希标签 {foo},确保 foo{foo}bar 都属于同一个槽位,从而避免跨槽位操作。

总结

通过上述表格和示例,你应该能够更好地理解在 Redis Cluster 模式下使用 Lua 脚本时需要注意的事项。特别是:

  1. 必须带有至少一个键:确保 Lua 脚本中至少有一个键,以便代理可以根据键将脚本转发到正确的 DB 分片。
  2. 多个键必须属于同一个槽位:使用哈希标签确保多个键属于同一个槽位,避免跨槽位操作。

乐于分享和输出干货的WXGZG:JavaPersons

在这里插入图片描述


http://www.kler.cn/a/393596.html

相关文章:

  • 【算法一周目】双指针(2)
  • 阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元
  • WordPress HTTPS 配置问题解决方案
  • acwing算法基础02一高精度,前缀和,差分
  • 【插件】多断言 插件pytest-assume
  • C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
  • N种方式解决
  • 计算机图形学论文 | 木工设计与制造计划的共同优化
  • 计算机毕业设计——ssm基于JAVA的求职招聘网站的设计与实现演示录像 2021
  • LeetCode【0009】回文数
  • 微信小程序=》基础=》常见问题=》性能总结
  • 期货配资系统行情源对接通讯协议范本
  • 如何选择适合小团队的项目管理工具?免费与开源软件推荐
  • cache中命中率和平均访问时间
  • odoo 17 后端路由接口认证自定义
  • 前端常用布局模板39套,纯CSS实现布局
  • Python 虚拟环境创建
  • Linux解决 -bash: nc: command not found-bash: nc: 未找到命令
  • hive的tblproperties支持修改的属性
  • QT自定义控件封装
  • axios三层封装
  • Java应用线上问题排查指南
  • 16008.行为树(五)-自定义数据指针在黑板中的传递
  • 深入理解 React 架构从概览到核心机制
  • redis 原理篇 28 通信协议 RESP协议
  • LeetCode40:组合总和II