Поэтому я просто увеличиваю баллы в отсортированном наборе. Это единственная команда, которую я запускаю, около 10-30 команд в секунду, из приложения Java, используя клиент Jedis. Поскольку я просто обновляю оценки, меня тоже не волнует ответ. Меня беспокоит то, что каждая команда ZINCRBY
помещается в свой собственный TCP-пакет, а также ожидает следующего ответа, прежде чем разрешить моему потоку отправить следующий поток ZINCRBY
.
Итак, я хочу просто реализовать конвейерную обработку, скажем, 50 команд за раз. Вот где я вижу запах кода/паттерна дизайна: разве этот шаблон проектирования не достаточно распространен, чтобы драйвер мог с ним справиться? Похоже, что драйвер .net «StackExchange.redis» автоматически выполняет пакетную обработку команд, но драйверы Java не имеют этой функции? Действительно ли нужна моя идея создать собственный класс буфера команд Redis, который помещает входящие команды в конвейер и вызывает sync()
после 50 элементов?
Кроме того, я заметил это в своих журналах, так как использую Jedis через Spring Data Redis:
20160929 06:48:27.393 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.393 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.393 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.393 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.393 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.394 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.394 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.629 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.630 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.630 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.631 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.631 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.631 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.631 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.631 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.632 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.632 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.632 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.632 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.632 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.633 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.633 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.633 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
20160929 06:48:27.633 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Opening RedisConnection
20160929 06:48:27.633 [Twitter4J Async Dispatcher[0]] DEBUG o.s.d.r.c.RedisConnectionUtils # Closing Redis Connection
Таким образом, кажется, что он закрывает соединение для наивно выполненной команды (через шаблон шаблона, предоставленный Spring). Я думаю, что закрытие соединения заставляет TCP-буфер отправлять одну команду на пакет, так что мне это кажется довольно неэффективным, поскольку сокеты поглощают изрядное количество ЦП. Хотя Spring Data Redis API разрешает прямой доступ к клиенту Jedis и не закрывает соединения, если конвейер в данный момент открыт, поэтому запись «конвейерного буфера» является вариантом с этим.
Короче говоря, должен ли я создать/использовать буфер, который записывает в конвейер Redis и сбрасывает данные после X-команд? Мне просто не нравится идея тратить все эти циклы ЦП (более высокий счет AWS) на наивное выполнение каждой команды, и мне любопытно, есть ли лучший шаблон проектирования для моего сценария. Или если переключение на другой клиент Java Redis решит эту проблему. Или если есть какая-то библиотека Java, которая уже буферизует команды в конвейере Redis.