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);

 

posted @ 2020-06-28 17:04  jongty  阅读(599)  评论(0编辑  收藏  举报