private function atomicPush($jobId, $class, $args = [], $queue = self::QUEUE, $retry = true, $doAt = null)
    {
        if (array_values($args) !== $args) {
            throw new Exception('Associative arrays in job args are not allowed');
        }

        if (!is_null($doAt) && !is_float($doAt) && is_string($doAt)) {
            throw new Exception('at argument needs to be in a unix epoch format. Use microtime(true).');
        }

        $job = $this->serializer->serialize($jobId, $class, $args, $retry, $queue);

        if ($doAt === null) {
            $this->redis->sadd($this->name('queues'), $queue);
            $this->redis->lpush($this->name('queue', $queue), $job);
        } else {
            $this->redis->zadd($this->name('schedule'), $doAt, $job);
        }
    }