比如PHP收到两个并发的请求A和B,要求只能其中一个请求处理S1操作,另一个请求直接返回失败,可以通过redis去解决:
SETNX(SET if Not eXists)是 Redis 中的一个原子命令,用于设置键-值对,但只有在键不存在时才执行设置操作。可以利用 SETNX 命令来实现并发请求的互斥处理,确保只有一个请求能够成功执行。
$key = "request";$valid_set = $redis->setnx($key, 1);if ($valid_set) { //@todo 成功拿到锁的请求 //@todo 处理S1事务 //@todo 处理完释放锁 $redis->del($key);} else { //@todo 如果设置失败,表示已经有其他请求获取到了锁,当前请求不处理 return false;}
使用 SETNX 命令尝试设置键-值对。如果 SETNX 返回 1,表示当前请求是第一个获取到锁的请求,可以执行相应的业务逻辑;如果 SETNX 返回 0,表示已经有其他请求获取到了锁,当前请求不处理。
需要注意的是,即使 SETNX 返回 1,表示当前请求获取到了锁并执行了业务逻辑,仍需要在合适的时机释放锁,以防止死锁情况的发生。在上述示例代码中,使用 redis->del() 命令在业务逻辑执行完毕后释放锁。
来源地址:https://blog.csdn.net/panguangyuu/article/details/132597958