商城秒杀 如何使用 redis 锁 php
时间: 2024-10-23 20:18:04 浏览: 10
在商城秒杀场景中,为了防止并发导致的商品库存异常,通常会利用Redis的分布式锁机制来保证只有一个请求能够获取并执行秒杀操作。以下是使用Redis锁和PHP实现的一个简单流程:
1. **获取锁**:
- 使用Redis的`SETNX`命令尝试设置一个唯一的键,如果该键不存在则设置成功,返回值为1(成功),否则返回0(失败)。这个过程可以认为是获取锁的操作,因为只有最先获取成功的请求才能执行后续操作。
```php
$lockKey = "seckill_" . $itemId;
$lockTimeout = 60; // 锁的有效时间,单位秒
$acquired = (int) Redis::setnx($lockKey, time() + $lockTimeout);
```
2. **检查锁是否有效**:
- 设置锁后,需要检查锁是否过期。如果当前时间大于锁设置的时间加上锁超时时间,说明其他请求已经设置了新锁,这时应释放原有的锁并跳出秒杀流程。
```php
if (!$acquired || Redis::ttl($lockKey) < 0) {
Redis::del($lockKey); // 如果锁过期或未获取到,删除并退出
return false;
}
// 锁已成功获取,下面执行秒杀逻辑
```
3. **秒杀逻辑**:
- 检查商品库存、用户资格等,如果符合条件,减少库存并记录订单。
4. **解锁**:
- 秒杀操作完成后,释放锁,确保其他等待的请求有机会继续。
```php
Redis::expire($lockKey, $lockTimeout); // 更新锁的过期时间
Redis::del($lockKey); // 删除锁
```
5. **错误处理**:
- 如果在执行过程中遇到错误,例如数据库连接异常,应及时删除锁,避免死锁。
阅读全文