Я пытаюсь написать систему производителей/потребителей, использующую Redis в C#. Каждое созданное сообщение должно потребляться только одним потребителем, и я хочу, чтобы потребители дождались элементов, созданных потребителем. Моя система должна поддерживать множество производимых/потребительских наборов.StackExchange.Redis ListRightPop не ждет результата
Я использую StackExchange.Redis
для связи с Redis и с использованием списков, в которых элементы добавляются с помощью ListLeftPush
и удаляются ListRightPop
. То, что я испытываю, заключается в том, что, хотя метод ListRightPop
должен блокироваться до тех пор, пока элемент не будет присутствовать в списке (или после определенного таймаута), он всегда возвращается автоматически, если в списке нет элементов. Это тестовый код, который я написал, чтобы проверить это:
IDatabase cache = connection.GetDatabase();
Trace.TraceInformation("waiting "+DateTime.Now);
var res = cache.ListRightPop("test");
Trace.TraceInformation("Got "+res+", Ended" + DateTime.Now);
И я получаю nil
результат после того, как менее чем за 1 секунду.
Как обычно, лучше всего перейти прямо к источнику. – welegan
Марк - спасибо за указатель и за отличную рамку! Попробуй это. Тем не менее, это означает, что мы выполняем две круглые поездки на сервер кеша? Значительно уменьшает производительность решения :-( – vainolo
@vainolo нет, это не значит, что особенно, если вы «стреляете и забываете» трансляцию. Они очень хорошо контактируют. Что касается паба/sub вообще: это удивительно быстро - это то, как мы приводим в действие наш сервер веб-сокетов для живых обновлений здесь, в stackoverflow, который имеет 6-значное число подключенных клиентов. –