php+redis实现消息队列功能

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

应用场景:

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

优点:

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

流程:

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

备注:

1、建议定时任务入队列
2、建议定时任务出队列


   /**
     * 把请求数据写入redis队列中(入队)
     */
    public function inqueue()
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $password = '';
        $redis->auth($password);
        //$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));
        }
    }

    /**
     * 读取队列数据写入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 "出队完成";
        }
    }

    /**
     * 查看队列中的当前数据
     */
    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);
    }

 

你可能感兴趣的:(PHP,MYSQL)