Redis 高并发下处理抢购,抢红包,秒杀
程序员文章站
2022-03-13 17:20:05
欢迎大家访问我的博客www.kevink.club, 定时更新php, swoole, golang,redis等内容### 方案1,使用redis 加锁机制实现原理:后台创建红包后,将红包个数存入redis,采用常量键名拼接红包id 作为key,红包个数为value存入redis,然后当用户领取红包的时候,前端肯定传红包id到后端,后端 先加redis锁,然后根据接收的红包id 读取key对应的值就是红包剩余个数,然后减1后再存入。redis 锁机制处理方法,详见:http://www......
欢迎大家访问我的博客 www.kevink.club, 定时更新php, swoole, golang,redis等内容
### 方案1,使用redis 加锁机制实现
原理:后台创建红包后,将红包个数存入redis,采用常量键名拼接红包id 作为key,红包个数为value存入redis,然后当用户领取红包的时候,前端肯定传红包id到后端,后端 先加redis锁,然后根据接收的红包id 读取key对应的值就是红包剩余个数,然后减1后再存入。
redis 锁机制处理方法,详见:http://www.kevink.club/archives/122.html
### 方案2,不使用redis 加锁机制实现
假设红包个数为10个, 在创建红包的时候,循环向red_pack_id . $packet_id 数组存放10个数,例如存入10个1 ,数字的值不没有实际意义,只是为了表明数组中有10个元素,每次有人领取到一个红包,就从数组red_pack_id . $packet_id 中pop出一个值,表示可领取的红包的个数减少了
public function getPacket(Request $request) {
$packet_id = $request->input('packet_id',0);
if(!$packet_id){
return Response::error('缺少参数:packet_id') ;
}
$redisConfig = config('database.redis.default');
$redis = new Client($redisConfig);
$count = $redis->lpop('red_packet_id:'.$packet_id);
if(!$count){
return Response::error('已经抢光了哦') ;
}
return Response::success('恭喜您,抢到了哦!') ;
}
缺点:
* 这种办法如果红包个数1000个是要往队列插入1000条。
本文地址:https://blog.csdn.net/qq_21761149/article/details/107386477