PHP中使用redis实现锁
业务背景:同一个订单被多人操作,造成脏数据
解决方法:使用redis上锁
//加锁 $redis->set($key, $value, ['nx', 'ex' => $ex]); //解锁:解锁用 delete 删除 key; 但是这里有个坑,不能直接用 delete,因为假设 client01 获得了锁,在添加用户进入房间的过程中 时间超过了 3秒 ,这个时候client02 就会同样获得锁并且设置3S,然后当client01 操作完之后 delete key , 就把 client02 设置的锁删除了; //这里推荐用 lua 代码执行删除,因为lua 执行具有原子性。 // lua 脚本解锁 // 先判断 key的值是否为 value, TRUE 才会删除, 所以 $value 的设计要有随机唯一性 $script = 'if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end '; $redis->eval($script, array($key , $value), 1);
慢慢来才是最快的