2009-07-14 3 views
15

Memcached에는 키에 대한 문자 제한 사항이 아니라 일부 키 (250?) 및 값 (대략 1MB)에 대한 길이 제한이 있습니다. 자신의 의견을 피할 수있는 가장 좋은 방법은 무엇입니까? 나는 Perl API Cache :: Memcached를 사용한다.memcached의 키/값 제한을 어떻게 해결합니까?

원래 값이 너무 크면 (주 : "부품 번호 : <>") 주키의 값에 대한 특수 문자열을 저장하고 그 경우에는 < 번호> 1+ < 메인 키>, 2+ < 메인 키> 등등. 이것은 어떤 경우에는 "정상"(그러나 지저분한 것)으로 보이고, 다른 사람들에게는 그렇게 좋지 않으며, 일부는 언제든지 누락 될 수있는 본질적인 문제가 있습니다 그래서 다른 사람들을 지키기 위해 공간이 낭비되고 시간 낭비가 낭비됩니다.)

핵심 제한 사항으로는 해싱을 구현하고 값에 충돌을 해결하기 위해 전체 키를 저장할 수 있지만 아직 수행 할 필요가 없습니다.

누구나보다 세련된 방식을 사용하거나, 임의의 데이터 크기 (및 키 값)를 투명하게 처리하는 Perl API가 있습니까? 누군가가 임의의 키/값을 지원하기 위해 memcached 서버를 해킹 했습니까?

답변

20

서버는 이미 당신이 원하는 크기를 지정할 수 있습니다 않습니다 사람들이 큰 객체를 캐시하고자하는 경우 그러나, 대부분의 시간, 그들은 뭔가를 잘못하고있는

-I   Override the size of each slab page. Adjusts max item size 
       (default: 1mb, min: 1k, max: 128m) 

. 에 많은 양의 데이터가 필요합니까? 캐시 키가 있습니까? 비 압축?

작업이 충분히 큰 경우 대기 시간이 짧은 액세스의 이점은 실제로 데이터를 전송하는 데 걸리는 시간이 줄어 듭니다. 또는 동일한 키에 모든 것을 던지면 프론트 엔드가 많은 데이터를 deserialize하기 위해 많은 작업을해야한다는 것을 의미합니다.

귀하의 필요에 따라 다르며, 내가하는 일에 대해 더 많이 알지 못하면 무엇이 최선인지 말할 수 없습니다. 1MB보다 큰 것을 필요로한다면, 우리는 -I을 추가 한 것입니다.

0

값이 너무 큰 경우 표준 값 (디코딩 될 때 항상 사전 이었음)을 저장하는 대신 키 목록을 저장했습니다. 그런 다음 각 키의 데이터를 읽고 주 값을 복원했습니다. 우리가 너무 길 때 키를 해싱했다고 생각합니다 (데이터 집합에서 일어날 수 있지만 극히 드문 경우).

이 코드를 memcached 클라이언트 (우리는 Python을 사용하고있었습니다) 위에 직접 작성 했으므로 상위 레벨에서 모두 투명합니다.

-2
$key=abs(crc32($long_key)) 

당신이 memcache에가 보는 250 개 문자 이상 변경이있을 수 있습니다 쿼리 및 기타 긴 키에 대한 고유 키를 얻을이 방법. = ABS (CRC32 ($의 long_key))

이 방법

+20

충돌이 일어날 수 있습니다. –

+1

동의. CRC32는 최소한의 MD5 해시를 사용하여 많은 충돌을 줄 것입니다. –

9

$ 키는 쿼리와 이 memcache에가 보는 250 개 문자 이상 변경이있을 수 있습니다 다른 긴 키의 고유 키를 얻을.

와우 ... 조심하세요. 좋은 충고,하지만 중요한주의 사항은 없습니다. 그것은 충돌을 일으킬 수 있습니다.물론 그럴 가능성은 희박하지만, 지구를 파괴하는 버그를 일으키기 위해서는 한 번만 발생해야합니다. memcached와 함께 긴 키를 저장하고 항상 키의 충돌을 다시 확인하기를 원할 것입니다. 이들을 다루는 가장 좋은 방법은 long_key/value 쌍의 간단한 목록을 저장하는 것입니다.

+0

다른 곳에서 유지되는 데이터를 캐시하기 위해 memcached를 사용하는 (대부분의) 시나리오에서는 충돌이 발생할 확률이이를 둘러싼 프로그램의 우려를 부정합니다. 높은 충돌 속도에 대한 memcached를 모니터링하기 만하면 문제가 있는지 알려주고, 서로 겹쳐 쓰는 키를 찾는 데 시간을 할애 할 가치가 있습니다. 캐싱 전략이 올바르게 구현되고 지속 된 데이터를 캐싱하는 경우, 성능이 저하되는 경우가 발생하지만 문제는 발생하지 않습니다. –

+3

캐싱 할 내용에 달려 있습니다. 캐싱 된 정보가 사용자에게 비공개 인 경우 해시 충돌은 개인 데이터 유출을 의미 할 수 있습니다 (이는 지구를 파괴하는 버그라고합니다). 해시 충돌 확률을 효과적으로 0으로 만드는 해시가 있지만 crc32는 그 중 하나가 아닙니다. 해시 콜리 전 확률이 77,000 개를 약간 넘는 데 반해 1 in 2 (http://preshing.com/20110504/hash-collision-probabilities)입니다. 키에 더 나은 해시 함수를 사용하면 도움이되지만, 충돌에 대한 계정 정보가있는 모든 해시 테이블 구현이 도움이됩니다. 그것은 어렵지 않습니다; 키를 저장하고 확인하십시오. – peabody

-1

실제 질문과 관련이 없지만 APC로 전환하는 것과 관련하여 생각해보십시오. len 키는 9727 문자입니다. (PHP 5.3.2에서 테스트 됨)

관련 문제