redis 秒杀成功 mysql_如何使用Redis实现秒杀

如何使用Redis实现秒杀

发布时间:2020-07-15 14:33:30

来源:亿速云

阅读:150

作者:Leah

如何使用Redis实现秒杀?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

导语:秒杀想必大家都了解,在短时间内请求访问会激增,同时要保证不会超卖和数据的准确,对于技术方面还是有些考验的。可惜的是,一直没有机会在项目中实现。再看了一些资料后,打算实验下。以下代码仅为测试所用,环境比较简单,请根据实际情况进行修改。

创建秒杀队列

在开始秒杀之前,先将商品放入队列中,如下/**

* 创建秒杀列表

*/

public function createList()

{

$count = 30;

$redisKey = 'goods_list';

for ($i = 1; $i <= $count; $i++) {

// 测试用,防止数据错误

if (Redis::llen($redisKey) >= $count) {

break;

}

Redis::rpush($redisKey, $i);

}

}

执行完后,在 Redis 中看下

2013dc457618fe04440db3ed6567ac25.png有 30 个商品 ID,数据正常。

秒杀

接下来是关键的一步,使用的是 Redis 的 lpop 命令获取商品 ID,利用的是 Redis 的原子性。/**

* 秒杀

*/

public function buy()

{

// 随机用户名,无意义,仅做标记

$username = Hash::make(now());

if ($goodsId = Redis::lpop('goods_list')) {

// 购买成功

Redis::hset('buy_success', $goodsId, $username);

} else {

// 购买失败

Redis::incr('buy_fail');

}

}

如上,简化了代码,购买之后,成功与否只是做记录。实际应用中,当然会更加复杂,但要注意的是,不要同步操作 Mysql。多说一句,Hash:make(now()) 即使值相同,也不会生成相同的数据,参考这里。

测试

最后就是进行测试了,使用 ab 测试,执行 ab -c 300 -n 3000 http://localhost/buy/ ,上述命令的意思是 300 并发,共请求 3000 次

fde785476557c8b540600aaf1b7e4d61.png

执行完成,速度并不快,并且还有 794 个访问失败。来看下数据是否正确吧。在页面中打印 buy_success 值

01ac72e3e8e16ce992c1ce48d7ac8b39.png

30 个成功者。再来看下秒杀失败的数量

ed3288b33c8182b5c163fae0e8622bd8.png不是一个准确的数字,2165+30 是所有请求成功的数字,再加上失败的 794 ,总数是 2989,依然不足 3000。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值