Внедрение конвейерной обработки и транзакций в кластер Redis с использованием пакета go-redis без WATCH

Мое требование состоит в том, чтобы реализовать конвейерные транзакции, подключающиеся к кластеру Redis с помощью go. Я использую пакет go-redis, который поддерживает кластер Redis, конвейерную обработку и транзакции. Как реализовать конвейерные транзакции без использования ключа WATCH в пакете go-redis. Я также просмотрел Tx.Pipeline() в пакете. Ключ WATCH необходим при реализации транзакции.


person PLSD    schedule 09.12.2016    source источник
comment
Что не так с использованием метода Watch? Если вам не нравится API, redigo — еще один популярный пакет.   -  person JimB    schedule 09.12.2016


Ответы (1)


Вы, вероятно, получите неудовлетворительные результаты с комбинацией конвейера, транзакций (MULTI/EXEC) и кластера. В Redis Cluster вы будете общаться с несколькими серверами. Здесь это важно, потому что и конвейерная обработка, и MULTI/EXEC являются командами, ориентированными на один узел.

Конвейерная обработка — это, по сути, постановка в очередь набора команд и отправка их на сервер в виде одного сетевого вызова. Если ваши команды должны отправляться на разные узлы кластера, это не сработает, поскольку вы не можете использовать одну сетевую отправку для отправки на несколько узлов.

Точно так же MULTI существует только внутри узла, на который он был отправлен, а не на весь кластер. Таким образом, если ваши команды в multi/exec ключах доступа на разных узлах, у вас не будет надежных транзакций.

Как это проявляется, неизвестно, потому что это зависит от клиентской библиотеки и любых проверок, которые она выполняет, например, как она обрабатывает перенаправление во время блока транзакции.

В конечном счете, однако, если вам абсолютно необходим конвейерный multi/exec, вам нужно либо убедиться, что все ключи находятся на одном узле, используя метод «хэштега» Redis; использовать код на стороне клиента, чтобы проверить, где находятся все ключи, вызывая ошибку, если не на том же узле, а также надеясь, что ключ не был перемещен между проверкой и выполнением команды; или не использовать кластер. В первых двух случаях вы захотите использовать WATCH, чтобы указать используемые ключи, что даст вам возможность обнаружить изменение слота, а также определить условия разных узлов.

person The Real Bill    schedule 09.12.2016