基于PHP+redis的秒杀系统

9 篇文章 0 订阅
PHP原生代码编写,没有基于框架,主要让用户了解秒杀原理。
github: https://github.com/sanjiOP/seckill


seckill 秒杀系统

环境:
1. php5.6 + phpredis扩展
2. redis服务
3. apache2
4. mysql:table 商品表(goods) + 订单表(order)

实现功能:
1. 基于redis队列,防止高并发的超卖
2. 基于mysql的事务加排它锁,防止高并发的超卖

基于redis队列工作流程:
1. 管理员根据goods表中的库存,创建redis商品库存队列
2. 客户端访问秒杀API
3. web服务器先从redis的商品库存队列中查询剩余库存
4. redis队列中有剩余,则在mysql中创建订单,去库存,抢购成功
5. redis队列中没有剩余,则提示库存不足,抢购失败

基于mysql事务和排它锁工作流程:
1:开启事务
2:查询库存,并显示的设置写锁(排他锁):SELECT * FROM goods WHERE id = 1 FOR UPDATE
3:生成订单
4:去库存,隐示的设置写锁(排他锁):UPDATE goods SET counts = counts – 1 WHERE id = 1
5:commit,释放锁
注意:第二步不可以设置共享锁,不然有可能会造成死锁。

压测工具:
apache自带ab测试工具 ./ab -n1000 -c100 http://host/buy_mysql.php
apache自带ab测试工具 ./ab -n1000 -c100 http://host/buy_redis.php
apache自带ab测试工具 ./ab -n1000 -c100 http://host/buy_transaction.php

如果您想下载到本地运行:
1. 修改 ./Seckill/Model/Model.php的mysql数据库链接信息
2. 修改 ./Seckill/Redis/QRedis.php的redis数据库链接信息
3. 访问:http://host/index.php
4. 访问规则:http://host/index.php?app=app&c=order&a=orderList&gid=1


github: https://github.com/sanjiOP/seckill
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少林码僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值