Redis切换阿里的云数据库Redis版过程遇到的一些问题记录

  2023 年下半年公司做信创迁移,把原本的原生 Redis 切换到了阿里的云数据库 Redis 版(后续简称 阿里云 Redis),切换后出现了一些问题,在此进行记录,并持续更新,如发现有遗漏的问题或内容存在错误,欢迎评论沟通!

阿里云 Redis
版本:Redis 5.0
架构类型:集群
连接模式:代理

1、Lua 脚本会执行出错

说明 仅 Redis 5.0 版本(小版本 5.0.8 以下)、4.0 及以下版本实例存在该限制。

  • 所有 key 都应该由 KEYS 数组来传递,redis.call/pcall 中调用的 Redis 命令,key 的位置必须是 KEYS array,且不能使用 Lua 变量替换 KEYS,否则直接返回错误信息:-ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array\r\n
    正确与错误命令示例如下:
# 本示例的准备工作需执行如下命令。
SET foo foo_value
SET {foo}bar bar_value

# 正确示例:
EVAL "return redis.call('mget', KEYS[1], KEYS[2])" 2 foo {foo}bar

# 错误示例:
# '{foo}bar'作为Key,应该使用KEYS数组进行传递。
EVAL "return redis.call('mget', KEYS[1], '{foo}bar')" 1 foo

# 在代理模式(Proxy)不允许执行此脚本,因为KEYS数据的索引是变量,但在直连模式中无此限制。
EVAL "local i = 2 return redis.call('mget', KEYS[1], KEYS[i])" 2 foo {foo}bar

# 不应该使用ARGV[1]数据元素作为Key。
EVAL "return redis.call('mget', KEYS[1], ARGV[1])" 1 foo {foo}bar
  • 调用必须要带有key,否则直接返回错误信息:-ERR for redis cluster, eval/evalsha number of keys can't be negative or zero\r\n
# 正确示例
EVAL "return redis.call('get', KEYS[1])" 1 foo

# 错误示例
EVAL "return redis.call('get', 'foo')" 0

解决办法
  修改 script_check_enable 配置参数,默认为 1 开启,修改为 0 关闭。关闭了对 Lua 脚本的额外检测,虽不推荐,但还是用这种方式解决了。ps:关闭检测后需注意 Lua 脚本的编写规范。
  当然,也可以通过升级 Redis 版本到 6.0 及以上解决。

[参考链接: 云数据库 Redis 版官方文档-Lua 脚本规范与常见报错]

2、项目中引入了 Redisson 框架做分布式锁,切换后发现无法 加锁 / 解锁
  查看报错日志后发现在加锁时,WAIT 命令执行失败,关键词提到 proxy,于是就去查了官方文档 [Proxy 的路由转发规则],在 Redis 命令概览 里找到了不同架构下的命令限制,
这里是不同架构的命令支持
直连模式支持,代理模式不支持,是因为代理模式是建立的长连接,而 WAIT 命令(为了同步写命令到从节点,达到主从一致,降低因主从切换导致分布式锁失效的风险)是阻塞客户端的(WAIT 命令总是返回在 WAIT 命令之前发送的写入命令被复制到的从结点数量。),所以为了保持所有连接的可用性,不支持这个命令。所以,在代理模式下,就用不了这个框架了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值