Конвейер транзакций Redis не выполняет все транзакции и вместо этого возвращает команды QUEUED - PullRequest
1 голос
/ 11 марта 2020

Go redis конвейер транзакций, не выполняет все транзакции и вместо этого возвращает команды QUEUED при вызове pipe.Exe c ().

(используется клиент Redis: "github.com/go -redis / redis / v7 "импортировано как красный)

Когда длина ключей> 9, структура cmders из pipe.Exe c () возвращает массив, в котором первый элемент имеет тип * redis.StatusCmd, с значением "QUEUED" и данными "multi". Остальные элементы имеют тип * redis.StringStringMapCmd, как и ожидалось.

    pipe := *red.Client.TxPipeline()

    for _, key := range keys {

        pipe.HGetAll(key)
    }

    cmders, err := pipe.Exec()
    if err != nil {
        return err
    }

Дополнительная информация / вещи, которые я пробовал:

  • Все ошибки равны нулю

  • Когда len (ключи) = 10 последняя команда в конвейере не выполняется и вместо этого QUEUED; массив cmders содержал 1 * структуры redis.StatusCmd и 9 * структуры redis.StringStringMapCmd, соответствующие первым 9 клавишам.

  • Увеличение количества клавиш приводит к пропуску большего количества команд. Например, когда длина ключей была 70, для последних 7 команд не было возвращено никаких структур * redis.StringStringMapCmd.

  • Та же проблема была обнаружена при использовании HDEL, HGET и HSET.

  • Добавление time.Sleep () до и после Exe c также ничего не изменило.

  • Наконец я попытался переставить массив ключей и обнаружил ту же проблему, последняя команда, добавленная в конвейер, была QUEUED.

...