redis乐观锁实现秒杀php,如何用Redis乐观锁实现秒杀功能

如何用Redis乐观锁实现秒杀功能

发布时间:2020-05-25 14:40:55

来源:亿速云

阅读:270

作者:鸽子

在大流量程序开发中,必然会遇到高并发的应用的场景。解决方案大致分为两个方向,消息队列、锁.

redis 实现消息队列核心简单版本$key = 'quque';

/**

* 秒杀商品数量有限,预先存储到消息队列

*/

public function qnquque() {

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

$redis->lpush($key,$i);

}

}

/**

* 这里省略掉业务逻辑处理,默认业务逻辑处理完,出队列

*/

public function dequque() {

$redis->rpop($key);

/**

* 这里开始商品购买后的业务逻辑处理

*/

}

消息队列是防止超买超卖很好的一种解决方案,要实现消息队列的高级功能需要用到专业的消息队列工具例如(rabbitmq).用户Redis 用户redis实现消息队列还是有一些缺点的,可以自行查找文章补充。这边不一一概述。最大问题还是分布式集群的问题。

Redis 乐观锁实现秒杀功能

它的优点如下:

消息队列对内存消耗较大,10000个请求,需要操作10000 出队列。容易造成内存资源瞬间爆棚

使用乐观锁的逻辑,CPU相对来说消耗较低、内存资源占用少$redis = new redis();

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

$cachekey = $redis->get("cachekey");

$number = 100; //抢购数量

if($cachekey

$redis->watch("cachekey");

$redis->multi();

//设置延迟,方便测试效果。

sleep(5);

//插入抢购数据

$redis->hSet("cachekeyList","user_id_".mt_rand(1, 9999),time());

$redis->set("cachekey",$cachekey+1);

$result = $redis->exec();

if($result){

$cachekeyList = $redis->hGetAll("cachekeyList");

echo "恭喜".$cachekeyList."抢购成功!
";

}else{

echo "再接再厉";

exit;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值