在探索分布式锁的过程中,遇到很多坑点
1.redis的set方法不支持$redis->set(keys,args,["NX","EX"=>3])写法;
2.百度到redis驱动可以通过comand命令来使用一些redis原生命令,测试部分命令可行,但set(keys,args,["NX","EX"=>3])操作仍然不行
3.网上查到可以用$redis->eval()执行LUA脚本来实现原子性操作,本地测试$redis->eval($lua,['ceshi',1,5],1);代码报错,怀疑是自己写法错误,找遍了网上资料,都是这样写的;
4.山穷水尽之时,只能跟着代码找问题,最终在predis源码中找到问题所在,正确用法$redis->eval($lua,1,'ceshi',1, 3)
总结: 网上的资料不一定都是对的,自己深入源码不仅能查到问题的本质,对自己的技能也是一个很好的提升
最终代码:
$script = <<<SCRIPT
return redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2])
SCRIPT;
$res = Redis::eval($script, 1,$cahce_key, 1, $limit_time);