共计 983 个字符,预计需要花费 3 分钟才能阅读完成。
在大流量程序开发中,必然会遇到高并发的应用的场景。解决方案大致分为两个方向,消息队列、锁
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<$number){
$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.” 抢购成功!<br/>”;
}else{
echo “ 再接再厉 ”;
exit;
}
}
结尾
本文并没有从零开始业务分析,都是核心的业务逻辑代码。需要结合实际的业务场景嵌入本文的核心实现逻辑。嘿嘿~