(3)这个队列和普通队列不一样,入队时的id是用来区分重复入队的,队列里面只会有一条记录,同一个id后入的覆盖前入的,而不是追加, 如果需求要求重复入队当做不用的任务,请使用不同的id区分
先看入队的代码分析:首先当然是对参数的合法性检测,接着就用到上面加锁机制的内容了,就是开始加锁,入队时我这里选择当前时间戳作为score,接着就是入队了,使用的是zset数据结构的add()方法,入队完成后,就对该任务解锁,即完成了一个入队的操作。
1 /** 2 * 入队一个 Task 3 * @param [type] $name 队列名称 4 * @param [type] $id 任务id(或者其数组) 5 * @param integer $timeout 入队超时时间(秒) 6 * @param integer $afterInterval [description] 7 * @return [type] [description] enqueue($name, $id, $timeout = 10, $afterInterval = 0) { (empty($name) || empty($id) || $timeout <= 0) return false; (!$this->_redis->lock->lock("Queue:{$name}", $timeout)) { 15 Logger::get('queue')->error("enqueue faild becouse of lock failure: name = $name, id = $id"); ; 17 } = microtime(true) + $afterInterval; (() { (false === $this->_redis->zset->getScore("Queue:$name", $item)) { 25 $this->_redis->zset->add("Queue:$name", $score, $item); 26 } 27 } ->_redis->lock->unlock("Queue:$name"); ; 33 34 }