Redis列表list实战——简单的消息队列异步处理

为了提升接口的性能,将一些对数据库的操作异步处理

list的特性,有序,可以作为队列(先进先出)也可以作为栈(先进后出)

场景:帖子的点赞、打赏、评论等操作需要改变帖子的热度。记录操作完成后,修改帖子热度的操作利用list异步执行。

以评论为例:

  1. 设计好异步执行类
class Async
{
    /**
     * 压入异步执行任务
     * @param $func
     * @param $args
     */
    static public function push($func,$args)
    {
        //call_user_func_array($func,$args);return;

        $cache = Cache::getInstance();
        $memKey = 'async';

        $task['func'] = $func;
        $task['args'] = $args;

        $cache->lPush($memKey,$task);
    }

    /**
     * 弹出异步执行任务
     */
    static public function pop()
    {
        $cache = Cache::getInstance();
        $memKey = 'async';
        $task = $cache->rPop($memKey);
        return $task;
    }

    static public function run()
    {
        $startTime = $endTime = time();
        while($endTime-$startTime<300)
        {
            $task = self::pop();
            if($task)
            {
                echo '0';
                call_user_func_array($task['func'],$task['args']);
            }
            else
            {
                echo '.';
                usleep(100000);//100毫秒
            }

            $endTime = time();
        }
    }

}
  1. 第一步。将操作压入list队列
functiton comment() {
    .
    .
    .
    //这里的Logic_Topic_News::hotInc代表后续调用的方法,array($newsId,1)代表传个这个方法的参数
    Async::push('Logic_Topic_News::hotInc',array($newsId,1));
    .
    .
    .
}
  1. 业务处理方法
class Logic_Topic_News {
    static public function hotInc($newsid,$inc=1)
    {
        //具体的业务逻辑
    }
}
  1. 接下来就是异步从list中取出数据进行处理async.php
set_time_limit(0);

require dirname(__FILE__) . '/entry.php';

$app = new Yaf_Application($config);
$app->execute("main");

function main()
{

    Async::run();

}
  1. crontab 执行定时任务,执行async.php

你可能感兴趣的:(Redis)