그래서 정렬 된 집합에서 점수를 증가시키고 있습니다. 이것이 Jedis 클라이언트를 사용하는 Java 응용 프로그램에서 초당 약 10-30 개의 명령을 실행하는 유일한 명령입니다. 나는 단지 점수를 업데이트하고 있기 때문에 응답에 대해서도 신경 쓰지 않습니다. 내 우려는 각각의 ZINCRBY
명령이 자체 TCP 패킷에 저장되고 내 스레드가 다음 ZINCRBY
스레드를 보내도록 허용하기 전에 다음 응답을 기다리는 것입니다.Redis Java Client : 성능 향상을 위해 명령을 파이프 라인에 버퍼해야합니까?
그래서 파이프 라이닝을 구현하여 한번에 50 개의 명령을 배치 할 수 있습니다. 다음은 코드/디자인 패턴 냄새가 나는 곳입니다.이 디자인 패턴이 드라이버가 처리해야하는 공통점이 아닌가? .net "StackExchange.redis"드라이버는 자동으로 일괄 처리 명령을 수행하지만 Java 드라이버에는이 기능이없는 것으로 보입니까? 들어오는 명령을 파이프 라인에 넣고 50 개 항목을 호출 한 후 sync()
을 호출하는 사용자 지정 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
을 그래서 봄 제공된 템플릿 패턴을 통해 순진 실행 된 명령에 따라 연결을 (폐쇄 것 같습니다 : 나는 봄 데이터 레디 스를 통해 Jedis을 사용하고 같은
또한, 나는 내 기록이 나타났습니다). 연결을 닫으면 패킷 당 하나의 명령을 보내도록 TCP 버퍼가 강제로 처리되므로 소켓이 상당한 양의 CPU를 먹기 때문에 꽤 비효율적 인 것으로 보입니다. Spring Data Redis API는 Jedis 클라이언트에 직접 액세스 할 수 있지만 현재 파이프 라인이 열려 있으면 연결을 닫지 않으므로 "파이프 라인 버퍼"를 작성하는 것이 좋습니다.
짧은에서 redis 파이프 라인에 쓰는 버퍼와 X 명령 이후의 플러시를 생성/활용해야합니까? 나는 순전히 각 CPU 사이클 (높은 AWS 청구서)을 낭비하는 생각을별로 좋아하지 않으며, 내 시나리오에 더 나은 디자인 패턴이 있는지 궁금해합니다. 또는 다른 Java Redis Client로 전환하면이 문제가 해결됩니다. 또는 이미 redis 파이프 라인에 명령을 버퍼링하는 Java 라이브러리가있는 경우
감사합니다. 나는 약간의 연구를 한 후에 상추를 사용할 생각이다. 내 유스 케이스에서는 스트리밍 트위터 API에서 읽고, 크기 50의 버퍼를 쉽게 채우고 connection.flushCommands();를 호출 할 수 있도록 충분한 일관성있는 redis 명령을 보내야한다. 나는 플러시 - 후 - 엑스 - 명령 또는 다른 화재 -와 - 잊지 최적화 기능을 이미 자바 드라이버에서와 같은 경우 .net StackExchange.redis 드라이버 (http://stackoverflow.com/questions 참조하십시오) 궁금 해서요/27796054/pipelining-vs-batching-in-stackexchange-redis) – Zombies
게시글에 결론을 추가하는 것을 잊어 버렸습니다. 최적화 대상을 아는 것이 중요합니다. 각 접근법은 자체 속성을 가지고 있으며 접근 방식과 사용 사례에 적합해야합니다. flush-after-x-commands 포인터를 주셔서 감사합니다. 이것은 관심의 대상 일 수 있습니다. – mp911de