Как клиент Redis Nio может работать? - PullRequest
1 голос
/ 25 августа 2011

Я нашел клиента Redis Nio.
он просто поместил команду в очередь,
всякий раз, когда есть ответ, проанализируйте ответ и прикрепите результат к первому элементу очереди.

например:

get(K key){
  Command cmd = new GetCommand();
  queue.put(cmd);
  send(cmd);
}
//invoked while any data receive from server
onReceive(Response res){
  queue.take().setResult(parse(res));
}

Сервер может гарантировать, что ответ будет отправлен в той же последовательности, что и запрос?
Или это только потому, что сервер redis использует один поток для обработки запроса? Могу ли я использовать этот подход в других случаях?

1 Ответ

2 голосов
/ 25 августа 2011

Это сработает, но вы должны быть довольно осторожны с такими вещами.На одном соединении, которое отправляет команды по порядку, вызывается из одного потока, вы получите ответы по порядку.

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

Для конкретного случая, который я предполагаю, этоклиент, которым вы пользуетесь, я нашел сообщение, которое может ответить на ваш вопрос более прямо:

Lettuce - это масштабируемый потокобезопасный клиент, построенный на основе превосходной платформы netty.Несколько потоков могут совместно использовать одно соединение, если они избегают блокирования и транзакционных операций, а управление несколькими соединениями эффективно осуществляется с помощью селекторов NIO.Внутренне салат полностью асинхронный и предоставляет как синхронные, так и асинхронные интерфейсы, а также асинхронные обратные вызовы pub / sub.

http://groups.google.com/group/redis-db/browse_thread/thread/fa05f025c9213ddf

...