php 使用redis实现消息队列

一、安装
1.下载redis。从下面地址下:https://github.com/MSOpenTech/redis/releases
2.打开dos命令栏,进入到redis的目录下面,输入以下命令:
redis-server.exe redis.windows.conf
3.测试,重新打开一个dos命令栏,进入到redis的目录下,输入以下命令:
redis-cli.exe -h 127.0.0.1 -p 6379
set key value 存值
get key 取值
二、安装Composer包依赖管理命令为laravel添加redis扩展。
1.安装Composer,选择php.exe所在目录。

2.为laravel添加redis扩展。
参考网址:http://www.tuicool.com/articles/E7Rfmq
在laravel项目更目录运行dos命令:
composer require predis/predis 1.0.*
配置redis,在config/database.php 中
'redis' => [ 'cluster' => false,
'default' => [ 'host' => '127.0.0.1',
'port' => 6379,
'database' => 0, ],
],

三、使用。

参考网址:
http://www.redis.net.cn/

引入文件

use Redis;

运行原始命令

Redis::command(命令,参数数组);

连接指定服务器

$redis = Redis::connection($host);默认连接默认的服务器。

字符

Redis::command('setnx',[$key,$val]);当$key没有时插入。

Redis::set($key,$val);设置key值得val值。

Redis::get($key);获取key值得val值。

Redis::del($key);删除键值;

Redis::command('Expire',[$key,秒]);过期时间。

队列

Redis::lpush($key,$val);往队列左侧插入一个val值,rpush右侧插入。

Redis::lpop($key);弹出队列左侧一个val值并返回val值,rpush右侧。

集合

Redis::sAdd($key,$val);插入集合;

Redis::sismember($key,$val);判断$val是否在集合内;

Redis::Smembers($key);查询所有成员。

有序集合:

Redis::zAdd('test',time(),'a',time(),'b');插入数据$key,索引,$val。

Redis::zrevrange('test',0,10000);查询指定范围内的成员。

代码实现:

 

   <?php
     namespace App\Http\Controllers;

      use App\Models\Goods;
      use App\Models\Test;
      use Illuminate\Http\Request;
      use Redis;

     //秒杀控制器
    class MiaoshaController extends Controller
   {

 /**
 * 秒杀,使用redis缓存
 * @param Request $req
 */
public function index(Request $req){
    $userId=$req->user_id;//用户id
    $goodsId=1;//商品id
     
    //判断该商品在redis中是否有库存,将库存数量存入redis
    if(!Redis::command('EXISTS',['goods_num_'.$goodsId])){
        $num=Goods::getOne(['id'=>$goodsId])->num;//通过数据库查询得到;
        Redis::set('goods_num_'.$goodsId,$num);//设置库存
        Redis::command('Expire',['goods_num_'.$goodsId,600]);//设置过期时间
    }
    //如果还有库存就提示抢购成功
    while(1){
        //判断该用户是否抢购过该商品了
        if(!Redis::sismember('zige_list_' . $goodsId,$userId)){
            //用户购买该商品,把该商品加入redis的队列中,
            Redis::lpush('list_'.$goodsId,$userId);//存入用户请求入队列
            Redis::lpush('zige_list_'.$goodsId,$userId);//长期存放在redis中做判断
    Redis::Decrby('goods_num_' . $goodsId, 1);//商品加入redis中redis库存减少
            echo('抢购成功' . '<br>');
            break;
        }
            //如果库存为0了,就说明这里的商品抢玩了
        if(Redis::get('goods_num_' . $goodsId)==0){
            echo('已经卖完了' . '<br>');
            break;
        }
    }
}

/**
 * 取出redis中的商品秒杀的消息队列存入mysql中
 * @param $goodsId
 * @param $fp
 */
public function SecKill($goodsId,$fp){
    //处理队列
    //取出队列的头部
    $tmp = Redis::lpop('list_' . $goodsId);
    while($tmp){
        //把取出的数据加入到mysql中
        Order::edit([$where],$info);
        $tmp = Redis::lpop('list_' . $goodsId);//取出队列的头部
        }else{
            //队列中没有数据,停止
            break;
        }
   }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值