PHP用redis秒杀功能,PHP 用redis做电商项目的秒杀功能

本文介绍了如何利用Redis的双向链表和队列特性实现高并发下的抢购功能。通过将商品库存放入Redis队列,利用lpush和lpop操作确保并发下单时的原子性,避免了传统MySQL事务在高并发下的性能问题。在下单过程中,先判断Redis队列库存,再执行支付,确保库存的准确。此外,还提到了设置库存缓存时间和下单前的库存检查步骤。
摘要由CSDN通过智能技术生成

参与过抢购活动就知道,很明显的一点是即便商品实际没有了也是可以下单成功的,但是在支付的时候会提示你商品没有了。

实现原理:list双向链表

使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行.(mysql事务在高并发下性能下降很厉害,文件锁的方式也是).

此处用到了Redis中的链表(list)数据类型:

‘栈’:从链表的头部添加元素,先进后出

124220b021187989c6d8174493d59291.png

'队列’:从链表的尾部添加元素,先进先出

b1f994c30044171a8b6465f515bd0e39.png

redis保存数据时都有key和value,key和value要么是String类型的,要么是byte[]类型的

第一步:先将商品库存存入队列

//链接redis$redis = new Redis();

$result = $redis->connect("127.0.0.1",6379);

//设置100件商品库存$goods_number = 100;

//将100件商品存入到Redis链表中for($i=0;$i

//lpush从链表的头部添加元素 $redis->lpush('goods_store',1);

}

//llen返回列表key的长度echo $redis->llen('goods_store');

?>

第二步:抢购开始,设置库存的缓存周期

//第二步,抢购开始,设置库存的缓存周期//设定一个key的活动时间 $redis->setTimeout('goods_store',60);

?>

第三步:客户端执行下单操作,下单前判断redis队列库存量

//第三步,客户端执行下单操作,下单前判断redis队列库存量

$redis = new Redis();

$redis->connect("127.0.0.1",6379);

//从链表的头部删除一个元素,返回删除的元素,$count为true

$count = $redis->lpop('goods_store');

if(!count){

echo "抢购失败";

return;

}

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值