func (q *Queue) AddTask(id int, task string) {
	task = strconv.Itoa(id) + ";" + task
	_, e := q.pool[q.redisID(id)].Do("RPUSH", q.queueName(id), task)
	checkErr(e)
}
AddTask will add a task to the queue. It will accept an ID and a string.
If more than one task are added with the same ID, queue will make sure they are send
to the same analyser as long as analyers does not return before next ID is poped from the queue.
package queue
import (
	"regexp"
	"runtime"
	"strconv"
	"time"
	"github.com/garyburd/redigo/redis"
)
type Queue struct {
	AnalyzerBuff int
	QueueName string
	Queues int
	urls   []string
	pool   []redis.Conn
}
func (q *Queue) queues() int {
	if q.Queues != 0 {
		return q.Queues
	}
	return 1
}
func (q *Queue) pendingKeyName(id int) string {
	return q.queueName(id) + "::PENDING::" + strconv.Itoa(id)
}
func (q *Queue) redisID(id int) int {
	return (id / q.queues()) % len(q.urls)
}
func (q *Queue) queueName(id int) string {
	if q.QueueName != "" {
		return q.QueueName + "::" + strconv.Itoa(id%q.queues())
	}
	return "QUEUE" + "::" + strconv.Itoa(id%q.queues())
}
func (q *Queue) analyzerBuff() int {
	if q.AnalyzerBuff != 0 {
		return q.AnalyzerBuff
	}
	return runtime.NumCPU()
}
func (q *Queue) Urls(urls []string) {
	q.urls = q.urls[:0]
	q.pool = q.pool[:0]
	for _, v := range urls {
		c, e := redis.DialURL(v)
		checkErr(e)
		q.urls = append(q.urls, v)
		q.pool = append(q.pool, c)
	}
}