이름 길이가 Redis의 성능에 영향을 줍니까?


129

예를 들어 Redis에서 자세한 이름을 사용하고 싶습니다 set-allBooksBelongToUser:$userId.

괜찮습니까? 아니면 성능에 영향을 줍니까?

답변:


198

당신이 사용하는 것에 대한 열쇠는 실제로 그렇게 오래되지 않습니다.

당신이 제공하는 예제 키는 세트에 대한 것이고, 세트 룩업 메소드는 O (1)입니다. 세트 (SDIFF, SUNION, SINTER)에서 더 복잡한 작업은 O (N)입니다. $userId더 긴 키를 사용하는 것보다 채우기가 더 비싼 작업 일 수 있습니다.

Redis에는이라는 벤치 마크 유틸리티가 제공됩니다. redis-benchmarksrc / redis-benchmark.c에서 "GET"테스트를 수정하여 키가 "foo"가되도록하면 다음과 같이 짧은 키 테스트를 실행할 수 있습니다 make install.

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);

다음은 짧은 키 "foo"의 3 번 연속 실행에 대한 GET 테스트 속도입니다.

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

소스를 다시 수정하고 키를 "set-allBooksBelongToUser : 1234567890"으로 변경 한 후의 GET 테스트 속도는 다음과 같습니다.

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

키를 다시 한 번 "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumipipiploreipsumloreipsumipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipip

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

따라서 실제로 실제로 긴 키조차도 redis 속도에 큰 영향을 미치지 않습니다. 그리고 이것은 O (1) 연산 인 GET에 있습니다. 더 복잡한 작업은 이에 덜 민감합니다.

나는 어떤 값을 가지고 있는지 명확하게 식별하는 키가 약식 키에서 얻을 수있는 작은 속도 성능보다 훨씬 크다고 생각합니다.

이 작업을 더 -r [keyspacelen]진행하려면 redis-benchmark 유틸리티에 임의의 키를 만들 수 있는 매개 변수가 있습니다 (키에 ': rand :'가있는 한), 접두어의 크기를 늘릴 수 있습니다 원하는 길이로 코드를 테스트하십시오.


6
얼마나 많은 공간을 차지합니까? 이 긴 키 중 백만 개가 있다면 메모리가 훨씬 크거나 디스크에 유지됩니까?
Derek Organ

9
@Derek Organ yep, 그것은 메모리가 차지하는 영향에 확실히 영향을 미치므로 키가 저장하는 것의 상당 부분을 차지하고 메모리 제한이 발생하면 덜 장황하고 싶을 것입니다. 유용성을 공간 고려 사항과 균형을 맞춰야한다고 생각합니다. 키를 사용하면 전체 조회 시간이 크게 길지 않지만 차지하는 공간이 늘어납니다.
Ted Naleid

우리는 일반적으로 가능한 가장 짧은 키 길이를 사용하고 "가독성"을 도메인 객체와 그 방법으로 옮깁니다. 또한 키에 짧은 네임 스페이스를 사용하여 Redis의 유지 관리 및 검사에 직접 도움을줍니다.
xentek

26

Redis는 모든 키를 메모리에 보관하는 것을 좋아합니다. 평균 키 길이가 길수록 메모리에 더 적을 수 있습니다. 그렇습니다. 키 길이는 성능에 큰 영향을 줄 수 있지만 우려되는 방식에는 크게 영향을 미치지 않습니다. 즉, 작은 키 공간 (예 : 메모리에 쉽게 맞는 키 공간)을 사용하면 128 바이트 키와 16 바이트 키가 크게 다르게 수행되지 않습니다.


4
Redis는 정의상 올인 메모리 저장소이므로 첫 번째 문장이 나에게 당황합니다.
Lee Grissom

5
@bmatheny, 쿼리를 올바르게 이해하면 Redis는 기본적으로 메모리 내 저장소이며 지속성을 지원합니다.
Najeeb

5

확실하게이 질문에 대답 할 수 없습니다. 그러나 그것에 대해 몇 가지 질문을하고 관찰 할 수 있습니다.

매우 긴 키 (이름) 및 / 또는 값이 전혀 사용될 수있는 경우 전체 성능에 성능에 영향을 줄 것임이 분명합니다. 이러한 영향은 클라이언트, 네트워크 또는 서버에 발생할 수 있습니다. 따라서 첫 번째 질문은 다음과 같습니다.

Redis와 고객간에 키와 값의 길이는 얼마입니까?

Redis , 키 길이제한을 검색하면 Redis vs. memcached 의 흥미로운 블로그 항목으로 인해 질문에 대한 답변을 시작할 수 있습니다. 이 블로그 항목에 대한 첫 번째 응답은 Redis의 작성자 인 Salvatore Sanfilipo (2010 년 초 가을 : 09/2010)에 의해 작성된 것으로 보입니다. 그로부터 Salvatore의 Redis / memcached Benchmark에 대한 두 가지 의견 은 원래 "블래 거"(익명 인 것 같습니다)에 응답 한 후 며칠간 게시되었습니다.

이것은 질문에 대한 답변이 아닙니다 (키가 얼마나 오래 지속될 수 있으며 어떤 지점에서 성능에 영향을 미치는지 감지 할 수 있음). 그러나 그것은 우리에게 질문에 접근하는 것에 대한 단서를 제공합니다.

이 두 기사의 저자는 코드를 작성하고 테스트하여 결과를 그래프로 표시했습니다.

우리는 모든 종류의 추측을 할 수 있습니다. 코드를보고 추론하려고 할 수 있습니다.

그러나이 종류의 질문에 접근하는 가장 의미있는 방법은 제안 된 사용 패턴을 측정하는 코드를 작성하고 다른 패턴을 테스트하는 코드를 작성하는 것입니다 (예 : 8 자에서 ... ... 8 킬로바이트를 원하십니까?) ... 그리고 그것을 측정하십시오.


-7

변수 이름의 길이가 성능에 영향을 줄 것이라고 생각하지 않습니다. 최대 이름 길이를 초과하지 않는 한 변수는 해당 데이터 유형에 대해 변수와 동일한 위치를 차지합니다.


6
찰리 : 이것들은 실제로 "변수"가 아니라 그들이 핵심입니다. 1에서 30 또는 100 또는 255 자 사이의 키의 경우 감지 가능한 성능 영향이 없을 수 있습니다. 몇 킬로바이트의 키를 만들거나 ... 수십 킬로바이트까지 성능 저하를 측정 할 수 있다고 생각합니다 (1K에서 70K 사이의 시점에서 키 크기가 커지므로 추가 네트워크 오버 헤드가 발생합니다) MTU를 초과하면 데이터가 여러 패킷에 걸쳐 끊어 져야합니다 (TCP가 발생하고 최소한의 재 조립 오버 헤드가 발생 함).
Jim Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.