php开发lua-redis脚本踩坑

php开发lua-redis脚本踩坑

  • 问题复现
  • 查找原因
  • 解决方法

问题复现

在业务开发中,需要反复读取并设置redis数据,为防止出现数据脏读现象,所以把一次操作写成lua脚本去redis中执行,在redis单进程下,使数据保持强一致性,但是后来开发完的脚本在本地可以正常运行,但是在测试环境不行

查找原因

在反复对比了测试环境与本地环境的区别,以及不停调整lua脚本测试得知,出现的原因是测试环境php与redis插件版本偏低,导致lua脚本脚本中无法执行二维数组
测试环境php版本:7.1,redis插件版本:3.1.2
本地环境php版本:7.2,redis插件版本:5.1

$lua = <<<LUA
	a = {1,2,3}
	b = {a}
LUA;

上面的代码在测试环境执行后就会返回false,而在本地环境就可以正常执行

解决方法

  1. 将php,redis插件进行升级
    优点:高版本的插件性能更好,功能也更强大
    缺点:需要对系统环境进行升级,有一定的风险,需要对项目进行风险评估
  2. 对代码结构进行调整
    优点:安全,有效,可以用cjson.encode将二维数组拍成一维数组,在php中恢复即可
    缺点:增加脚本复杂度,降低性能

你可能感兴趣的:(lua,php,redis)