基于Redis实现的环形队列

浏览:6027 发布日期:2017/04/06 分类:业务逻辑 关键字: redis 消息队列 环形队列
基于ThinkPHP3.2.3+Redis实现的环形队列
<?php
/**
 * 基本redis实现的环形消息队列
 * 用法:
 * use Com\RingQueue;
 * $queue = RingQueue::getInstance('msg');
 *
 * 加入队列
 * $queue->push('aaaaaa');
 * $queue->push('bbbbb');
 * 读取队列
 * $value = $queue->pop()
 *
 * 删除队列
 * $queue->flushQueue();
 */
namespace Com;


class RingQueue extends \Think\Cache\Driver\Redis
{
    static public $timeout = 1;
    static public $queueName = 'ring_queue';

    /**
     * 取得缓存类实例
     * @static
     * @access public
     * @return mixed
     */
    public static function getInstance($queueName)
    {
        if (C('DATA_CACHE_TYPE') != 'Redis') exit('DATA_CACHE_TYPE DO NOT Support Redis');

        //当前队列名称
        self::$queueName = 'ring_' . $queueName;

        static $_instance = array();
        if (!isset($_instance[self::$queueName])) {
            $_instance[self::$queueName] = new RingQueue();
        }

        return $_instance[self::$queueName];
    }

    //设置队列名称
    public static function setQueueName($name)
    {
        self::$queueName = 'ring_' . $name;
    }

    /**
     * 添加队列(lpush)
     * @param string $value
     * @return int 队列长度
     */
    public function push($value)
    {
        return $this->lPush(self::$queueName, $value);
    }

    /**
     * 读取队列,将读取到的值放在队列最左侧
     * @return string|nil
     */
    public function pop()
    {
        $result = $this->brPop(self::$queueName, self::$timeout);

        if (empty($result)) {
            return $result;
        } else {
            //将取出来的值添加到最队列最左侧
            $this->lPush(self::$queueName, $result[1]);

             return $result[1];
        }
    }

    /**
     * 删除一个消息队列
     */
    public function flushQueue()
    {
        $this->delete(self::$queueName);
    }

    /**
     * 返回队列长茺
     * @return int
     */
    public function len()
    {
        return $this->LLEN(self::$queueName);
    }

}

?>
https://github.com/cfanbo/thinkphp-redis-mq/blob/master/RingQueue.class.php
评论( 相关
后面还有条评论,点击查看>>