数据混乱
最近在多个系统上发现php redis驱动在高并发下,存在数据获取混乱的问题
具体表现为
lpush key1
一个json,lpop key1出来的是set key2 xxx的值。
lpush key1
一个json,lpop key1出来 ‘+OK’字符串
以上两种情况在尝试更换驱动版本后在某些php版本下得到解决,线上用php redis驱动内置方法使用队列相关功能要注意是否在以上问题。
set上锁,提示失败,实际redis已经写入成功
使用 set key value nx ex time
上锁,php_redis驱动返回失败
使用monitor
命令观察,实际已经写入成功。
驱动使用4.x版本和5.02版本,两个版本驱动都出现了上述现象。
解决
由于最新版本驱动还是存在上述问题。经过多次测试,不使用内置方法,改为使用lua脚本可解决问题。如:
$script = 'if redis.call("SET", KEYS[1], ARGV[1], "nx", "ex", ARGV[2]) then return 1 else return 0 end';
if ($inst->eval($script, [$lock, $unique, $this->expire], 1)) {
$this->lockCache[$lock] = $unique;
return true;
}