2016-10-05 3 views
2

저는 최근에 Skype 인터뷰의 15 분짜리 세그먼트에 래퍼를 디자인하도록 요청 받았으며 여기에 제 디자인이 있습니다. 나는이 디자인에 대한 더 많은 의견을 듣고 그것을 디자인하는 더 좋은 방법이 있기를 바랍니다.1MB보다 큰 값을 허용하기 위해 memcached 용 래퍼를 설계하는 방법은 무엇입니까?

요구 사항 : 값 저장에서 Memcached의 제한 사항을 고려하면 모든 값 입력을 지원하는 Memcached (다른 데이터 구조 없음) 주위의 키 - 값 저장소 랩퍼입니다.

제안 :

  1. 데이터 구조 : 동일한 memcached를

  2. set(key, value) 상기 입력 키라고 memlarge

    • 체크 sizeOf(value)> 1메가바이트, 만약 있다면 예, spli t는 값 1MB와 set의 다중 바이너리로 값을 memcached에 넣고 다음과 같은 키 체계를 사용합니다.

    • 키의 고정 크기 해시 코드를 계산합니다. md5)의 사용이 고정 된 크기의 해시 코드를 연결할 memlarge-1memlarge-2이, ..., memlarge-n는, 결과 ABC, DEF 것이다 GHI

    • 말 및 접미사를 부가 원래 키 값으로 저장하고 접두사를 사용하여 get 메서드가 다른 값을 키 배열로 오인하지 못하도록합니다. 그래서 지금 memlargeprefixABCDEFGHIsuffix와 캐시, 즉 get('memlarge')
  3. get(key)prefixABCDEFGHIsuffix (아래 다음 이상) 반환합니다

    • 확인 결과가 배열

      의 접두사와 접미사가있는 경우
    • 예인 경우 다음 get 작업을 수행하여값을 구분하여 원래 값을 가져옵니다. 해시 코드 알고크기 ->get('ABC'), get('DEF'), get('GHI') 결국 값을 조인, 사용자에게 제안

비판을 반환 질문 후속 조치 :

  1. 을하더라도 접미사와 접두사가 있으면 임의의 저장된 값에이 접미어 &이라는 접두어가 붙을 가능성이 매우 낮습니다. 따라서 접두사/접미사 및 체크섬 (md5)을 생략 한 후 나머지 값의 길이 검사가 수정됩니다.

  2. 값 크기가 4MB 인 경우 5 get 작업이 필요합니다. 4로 줄이는 방법이 있습니까?

    이 문제에 대한 해결책은 링크 된 목록의 아이디어를 사용하는 것이라고 생각하지만 비트/바이트 수준 구현입니다. 값 청크는 "신호"를위한 공간을 절약하기 위해 1MB 제한 이전에 끝나며 다른 get (다음 노드)이 필요합니다. 신호는 위의 "배열"아이디어와 비슷하게 디자인 될 수 있습니다.

답변

-1

원래 요청에 대해 질문해야합니다. memcache (out-of-process)를 사용하여 인터뷰와 같이 큰 파일을 저장하면 더 나은 성능을 얻을뿐만 아니라 속도와 성능이 떨어집니다. 왜냐하면 memcache 내부에 넣을 모든 것을 알게 될 것이기 때문에 (프로세스 외부에서) 직렬화되어야하고 캐시에서 그것을 읽을 때 다시 deserialize 할 필요가 있기 때문입니다. 프로세스 외부 캐시에서 1MB 개체를 가져올 때마다 메모리에서 해당 개체를 빌드하는 데 상당한 CPU를 소비합니다. 필요한 경우 언제든지 인터뷰를 메모리에로드하면 훨씬 빠릅니다 .

+0

질문의 요점을 놓치고 있다고 생각합니다. 질문은 특별히 Memcached를 기본 데이터 저장소로 사용하여 Memcached에 대한 래퍼를 디자인 할 것을 요구하며, 1MB를 약간 넘는 값에서부터 기가 바이트까지의 값을 사용해야합니다. –