redis 简单使用队列
小白
2020-12-10
【原创文章】
tp5.1+rdis+720 秒杀并发处理
不啰嗦 简单上代码
/**
* 访问产品前先将当前产品库存队列
* @access public
* @author bieanju
*/
public function _before_detail(){
$where [ 'goods_id' ] = 1;
$where [ 'start_time' ] = array ( "lt" ,time());
$where [ 'end_time' ] = array ( "gt" ,time());
$goods = db( "goods" )->where( $where )->field( 'goods_num,start_time,end_time' )->find();
if(!$goods){
return '当前秒杀已结束';
}
if ( $goods [ 'goods_num' ] > 0){
$redis = new Redis();
$user_queue_key = 'user_list_key';//用户抢购列表key
$goods_number_key = 'goods_number_key';//商品列表key
//获取秒杀购买用户数量
$getUserRedis = $redis ->hGetAll($user_queue_key);
//获取商品队列
$gnRedis = $redis ->llen($goods_number_key);
/* 如果没有会员进来 商品队列空 则 把商品加入redis列表中 */
if (! count ( $getUserRedis ) && ! $gnRedis ){
//商品加入redis列表中
for ( $i = 0; $i < $goods [ 'goods_num' ]; $i ++) {
$redis ->lpush($goods_number_key , $i);
}
}
$resetRedis = $redis ->llen($goods_number_key);
//如果商品还没加入,报下面错误
if (! $resetRedis ){
$this ->error( "系统繁忙,请稍后抢购!" );
}
} else {
$this ->error( "当前产品已经秒杀完!" );
}
}/**
* 抢购商品前处理当前会员是否进入队列
* @access public
* @author bieanju
*/
public function goods_number_queue(){
$user_queue_key = 'user_list_key';//用户抢购列表key
$goods_number_key = 'goods_number_key';//商品列表key
//传入条件
$where[] = ['id','=',1];
$goods_info = db('商品库') ->where( $where )->find();
if(! $goods_info){
return '对不起当前商品不存在或已下架';
}
/* redis 队列 */
$redis = new Redis();
/* 进入队列 */
$goods_number_key = $redis ->llen($goods_number_key);
//去查秒杀记录改用户是否有
if (! $redis ->hGet($user_queue_key,session('uid'))) {
//没有减去商品队列--1
$goods_number_key = $redis ->lpop($goods_number_key);
}
if ( $goods_number_key ){
// 判断用户是否已在队列
if (! $redis ->hGet($user_queue_key,session('uid'))) {
// 插入抢购用户信息
$userinfo = array (
"user_id" => $this ->user_id,
"create_time" => time()
);
$redis ->hSet( $user_queue_key, session('uid'), serialize( $userinfo ));
return '秒杀成功';
} else {
//查询订单表
$cartlist = db('订单表') ->where(['uid'=>session('uid')])-> count ();
if ( $cartlist > 0){
return '秒杀成功';
} else {
return '秒杀失败';
}
}
} else {
return '系统繁忙,请重试';
}
} 上面是简单的demo
多用户排列,反之,把用户加入队列,后台程序去跑调用用户,当数量达到一定或固定数量,就关闭redis或者清理状态,用户排队界面直接抛出 已抢完 等提示
最新发布
职场:菜鸟->初级->高级->大神
- git 本地分支关联远程分支,合并!
- 守护进程-kill端口-输出日志-查看等!
- pytorch安装(含cuda、cudnn安装教程)!
- linux系统下ubuntu22.04安装Docker方法!
- 视频截取封面 =php-ffmpeg/php-ffmpeg!
- 常用实例2023-5-10!
- 富文本 塞入mysql 报错: General error: 1366 Incorrect string value: ‘\xF0\x9F\x98\x84‘ for column ‘content‘!
- 百度地图拖拽获取地址实例!
- php使用smtp鉴权方式发送邮件 插件PHPMailer!
- 有道翻译接口对接!
最热排行
职场:菜鸟->初级->高级->大神

