redis lua脚本开发采坑记

背景

系统中有批量读写redis的需求,为了提升效率,采用lua脚本的形式进行批量调用。
其中redis是集群部署的。

问题

改为lua脚本后,本机测试没有问题,上线后大概率出现数据不能正常写入redis的问题。
刚开始以为是redis版本不同造成的,看了一下版本,本机的是redis4.0.9,线上的是redis2.8.13-1,于是翻阅了大量的文档去查看两个版本对lua脚本的支持方面有什么不同。最终也没有什么收获。

后来咨询了运维的同学,问他们线上redis对lua脚本有什么限制,这才知道了问题的根本原因:lua脚本并不能保证在key对应的redis服务器上执行。

原因是这样的:redis集群由多台机器组成,每个服务器负责维护一定范围的key。而lua脚本中如果包含多台机器上的key,只有与第一个key在同一个机器上的命令能执行成功,所以会大概率出现部分脚本没有执行成功的问题。

既然发现了这个问题,那解决方案就非常明显了:保证lua脚本中所有的key都在同一台机器上,可以通过hashtag达到这个目的。

hashtag会把所有的key集中在一台服务器上,也就意味着即便我们拥有redis集群,但是真正使用到的机器只有一台,这是一个非常致命的缺陷。

所以最终还是采用pipeline方案了。

你可能感兴趣的:(redis)