内容简介:秒杀功能一般在购物网站比较常见,通过设定1到2件特别低价的商品,调动用户的积极性。具体是实现的思路: 1.用户发送秒杀请求,后台程序检测秒杀产品是否已经售完; 2.如果秒杀的产品库存数量大于0,则该请求秒杀成功,减少库存数量,更新用户的信息;
秒杀功能一般在购物网站比较常见,通过设定1到2件特别低价的商品,调动用户的积极性。
具体是实现的思路:
1.用户发送秒杀请求,后台程序检测秒杀产品是否已经售完; 2.如果秒杀的产品库存数量大于0,则该请求秒杀成功,减少库存数量,更新用户的信息;
表面上看没有问题,如果放到现实情况下,则暴露出严重的BUG:
从商品库存数量检测到秒杀成功后,更新库存剩余数量(商品数量减1),这之间只有一步,但是在大并发量情况下,几十个(甚至几百个)用户同时查询、减少,会造成库存数量为负数的情况,即多个用户同时秒杀到一款产品。
这就需要用到 redis 锁的机制,来限制并发查询和更新。
demo示例:
<?php
/**
*
* 秒杀请求程序入口
*
*/
$redis = new Redis();
$ret = $redis->connect("127.0.0.1", 6379);
if ($ret === TRUE) {
// 检测秒杀是否结束
if ($redis->get('goods.num') <= 0) {
echo ("秒杀已经结束");
return False;
}
// 获取锁之后才可以处理库存
tryagain:
$lock = $redis->setnx("lock", 1);
if ($lock === FALSE) {
goto tryagain;
}
// 获取锁之后检测库存
if ($redis->get('goods.num') <= 0) {
echo ("秒杀已经结束");
//删除锁
$redis->delete("lock");
return False;
}
// 更新秒杀产品剩余库存
$last_num = $redis->decr('goods.num');
if ($last_num < 0) {
echo ("秒杀已结束");
// 删除锁
$redis->delete("lock");
return False;
} else {
// 更新用户账户 记录秒杀成功用户信息
echo ("秒杀成功");
// 删除锁
$redis->delete("lock");
return True;
}
} else {
// 连接异常
die("Redis连接失败");
}
这里唯一要注意的一点,没有处理死锁的情况,即完成商品数量更新后,删除锁失败。
以上所述就是小编给大家介绍的《使用Redis锁概念实现秒杀》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 从基本概念到实现,全卷积网络实现更简洁的图像识别
- Laravel队列实现(概念讲解与Supervisor配置)
- Linux 死锁概念与银行家算法python 实现
- 基于 Swoole 构建高性能 Laravel 应用系列 —— 基于 Swoole 实现协程篇(一):基本概念和底层原理
- Flume的基本概念
- lucene基础概念
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。