먼저, the Redis benchmark page을 읽고 싶을 수 있습니다. Redis 조정을 확인하기위한 주요 요점에 대한 좋은 요약을 제공합니다.
파이프 라이닝을 사용하지 않는다고 가정해도 150ms 동안 300GET이 효율적이지 않습니다. 평균 대기 시간이 500 us임을 의미합니다. 그러나 실제로는 개체의 크기에 따라 다릅니다. 개체가 클수록 대기 시간이 길어집니다. 아주 오래된 2GHz AMD 박스에서, 작은 물체 (수 바이트)에 대한 대기 시간을 150 us 측정 할 수 있습니다.
빠르게 레디 스 인스턴스의 평균 대기 시간을 확인하려면, 당신은 사용할 수 있습니다
$ redis-cli --latency
이 옵션을 얻을 최근 레디 스 버전 (안 2.4)을 사용하십시오. 참고 : 2.4는 꽤 오래되었습니다. Redis 2.6을 사용하십시오. 필요하다면 Redis 버전을 컴파일하십시오. 정말 간단합니다.
신속 대기 시간을 공부하는 벤치 마크를 실행하려면, 당신은 실행할 수 있습니다 :
$ redis-benchmark -q -n 10000 -c 1 -d average_size_of_your_objects_in_bytes
은 고유 한 연결없이 파이프 라인으로 실행되므로 대기 시간은 처리량에서 추론 할 수있다. 이 벤치 마크의 결과를 응용 프로그램으로 측정 한 수치와 비교해보십시오.
왜 memcached가 더 좋습니까? 글쎄요, 하나의 memcached 인스턴스는 확실히 확장 성이 뛰어나며 다중 스레드에서 실행될 수 있기 때문에 단일 Redis 인스턴스보다 응답 성이 좋습니다. Redis는 빠르지 만 단일 스레드로 - 모든 명령의 실행이 직렬화됩니다. 따라서 명령이 연결을 위해 진행 중일 때 다른 모든 클라이언트는 대기해야합니다. 주어진 명령의 대기 시간이 길면 모든 보류중인 명령에도 영향을 미칩니다. 일반적으로 낮은 처리량에서는 성능이 비슷합니다.
1000q/s (Redis 또는 memcached 표준의 낮은 처리량)에서 클라이언트 측 (즉, 클라이언트 측)에 문제가있을 확률이 더 높습니다.클라이언트 라이브러리 선택, 연결/연결 끊기, 등등 ...), Redis 서버 자체보다.
마지막으로 HTTP 요청 당 여러 개의 Redis 쿼리를 생성하는 경우 최대한 멀리 Redis에 보내는 명령을 pipelining으로 간주해야합니다. 효과적인 Redis 응용 프로그램을 개발하는 것이 핵심 포인트입니다.
응용 프로그램 서버가 Redis와 동일한 상자에있는 경우 TCP 루프백 대신 UNIX 도메인 소켓을 사용하여 Redis에 연결할 수도 있습니다. 성능을 약간 향상시킵니다 (파이프 라이닝을 사용하지 않을 때 최대 처리량이 50 % 증가).
Redis가 동일한 서버에서 실행되고 있습니까? 클라이언트, 또는 memcached를 실행중인 클라이언트? Redis 요청에 대해 150ms는 스왑/디스크가 아닌 메모리를 사용하는 것처럼 들리겠습니까? 아니면 300 개의 요청 모두에 대해 150ms를 의미합니까? –
초당 약 100 개의 아파치 요청을 가진 웹 애플리케이션입니다. Redis는 웹 응용 프로그램 자체와 mysql 데이터베이스 서버와 같은 호스트에서 실행되지만 곧 Apache 3 개를로드 균형 서버로 옮길 계획입니다. 현재 서버에는 약 64GB의 RAM이 있으며 redis에는 약 100MB가 필요합니다. 충분한 양의 램이 있고 cpu 나 io에는 문제가 없습니다. 서버가 디스크로 스왑하지 않습니다. 그리고 네, 300 요청에 대해 150ms를 의미하지만, memcached는 동일한 조건 하에서 40ms 밖에 걸리지 않았습니다. – ak2
내가 생각할 수있는 것은 웹 요청 당 하나가 아닌 모든 요청에 대해 Redis에 대한 공유 연결을 사용하고 있다면 Redis에 대기 시간 문제가있을 수 있지만 초당 1000 요청에서는 나쁜 대기 시간을 보지 말아야한다는 것입니다. 죄송합니다. 오늘 내 방향에서 도움이되는 것은 아무 것도 없습니다. –