php+redis实现消息队列功能

51 篇文章 2 订阅

php+redis消息队列是php+mysql性能不足时的一个中间间处理方案。

应用场景:

用于服务器瞬间请求大,数据库压力大的情况。
如并发量大导致的超卖、并发量大导致的数据重复情况。

优点:

1、保证数据的可用性和准确性。
2、把服务器瞬间的请求处理转换成异步处理,缓解服务器的压力。
3、实现数据单条按顺序排列获取。

流程:

1、php接受请求和数据 
2、php把数据写入redis队列中(入队)【函数rpush
3、 shellj脚本定时调用php读取队列数据写入mysql(出队)【函数lpop
4、查看队列中的当前数据【函数lrange

入队:inqueue.php


   /**
     * 把请求数据写入redis队列中(入队)
     */
    public function inqueue()
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $password = '';
        $redis->auth($password);
        //这里可以是GET或POST请求过来的数据
        //$json = htmlspecialchars_decode($_POST["data"]); //GET或POST请求过来的数据
        $json = '[{"username":"张三","course":"语文","score":145},{"username":"李四","course":"数学","score":149},{"username":"王五","course":"英语","score":147}]';
        $arr = json_decode($json, true);
        foreach ($arr as $k => $v) {
            $redis->rpush("myqueue", json_encode($v));
        }
    }

出队:outqueue.php

  /**
     * 读取队列数据写入mysql(出队)
     */
    public function outqueue()
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $password = '';
        $redis->auth($password);
        //list类型出队操作
        $value = $redis->lpop('myqueue');
        if ($value) {
//            $myarr = json_decode($value, true);
//            if ($myarr) {
//                Db::execute("INSERT INTO `student` (username, course, score) VALUES ('" . $myarr["username"] . "','" . $myarr["course"] . "'," . $myarr["score"] . ")");
//            }
            echo "出队的值" . $value;
        } else {
            echo "出队完成";
        }
    }

shell process.sh:定时调用outqueue.php

#每分钟调用一次
*/1 * * * * /usr/local/nginx/wwwroot/process.sh
#process.sh
php /usr/local/nginx/wwwroot/outqueue.php

#每分钟调用多次
*/1 * * * * /usr/local/nginx/wwwroot/process.sh
#process.sh
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php

查看队列中的当前数据:

    /**
     * 查看队列中的当前数据
     */
    public function lookqueue()
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $password = '';
        $redis->auth($password);
        $list = $redis->lrange('myqueue', 0, -1);
        var_dump($list);
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值