上一篇文章基于lua-redis实现榜单类服务的数据一致性提到lua脚本的使用。
但是测试环境的redis是单机版的,而线上服务器确是集群版。导致同样的代码在线上服务器一直报错,经过测试发现集群版lua脚本的使用并不同于单机版。
command keys must in same slot
为了保持事务,同一个lua脚本访问应该访问同一个slot,但是redis集群会根据KEY进行hash并取模,因此如果采用默认hash的话,那么就会产生下面的错误。
解决方案,redis支持{}写法,可以实现对KEY的部分字符串进行hash,这样就能保证同一个lua脚本被同一个slot执行,从而保持事务的一致性。
EVAL ' local res = {} if ARGV[5] == "0" then res[1] = redis.call("ZCARD", KEYS[1]) end local data=nil if ARGV[