저는 최근에 Skype 인터뷰의 15 분짜리 세그먼트에 래퍼를 디자인하도록 요청 받았으며 여기에 제 디자인이 있습니다. 나는이 디자인에 대한 더 많은 의견을 듣고 그것을 디자인하는 더 좋은 방법이 있기를 바랍니다.1MB보다 큰 값을 허용하기 위해 memcached 용 래퍼를 설계하는 방법은 무엇입니까?
요구 사항 : 값 저장에서 Memcached의 제한 사항을 고려하면 모든 값 입력을 지원하는 Memcached (다른 데이터 구조 없음) 주위의 키 - 값 저장소 랩퍼입니다.
제안 :
데이터 구조 : 동일한 memcached를
set(key, value)
상기 입력 키라고memlarge
체크
sizeOf(value)
> 1메가바이트, 만약 있다면 예, spli t는 값 1MB와set
의 다중 바이너리로 값을 memcached에 넣고 다음과 같은 키 체계를 사용합니다.키의 고정 크기 해시 코드를 계산합니다.
md5
)의 사용이 고정 된 크기의 해시 코드를 연결할memlarge-1
가memlarge-2
이, ...,memlarge-n
는, 결과ABC
,DEF
것이다GHI
- 말 및 접미사를 부가 원래 키 값으로 저장하고 접두사를 사용하여
get
메서드가 다른 값을 키 배열로 오인하지 못하도록합니다. 그래서 지금memlarge
값prefixABCDEFGHIsuffix
와 캐시, 즉get('memlarge')
첫
get(key)
prefixABCDEFGHIsuffix
(아래 다음 이상) 반환합니다확인 결과가 배열
의 접두사와 접미사가있는 경우예인 경우 다음
get
작업을 수행하여값을 구분하여 원래 값을 가져옵니다. 해시 코드 알고크기 ->get('ABC'), get('DEF'), get('GHI')
결국 값을 조인, 사용자에게 제안
비판을 반환 질문 후속 조치 :
을하더라도 접미사와 접두사가 있으면 임의의 저장된 값에이 접미어 &이라는 접두어가 붙을 가능성이 매우 낮습니다. 따라서 접두사/접미사 및 체크섬 (md5)을 생략 한 후 나머지 값의 길이 검사가 수정됩니다.
값 크기가 4MB 인 경우 5
get
작업이 필요합니다. 4로 줄이는 방법이 있습니까?이 문제에 대한 해결책은 링크 된 목록의 아이디어를 사용하는 것이라고 생각하지만 비트/바이트 수준 구현입니다. 값 청크는 "신호"를위한 공간을 절약하기 위해 1MB 제한 이전에 끝나며 다른
get
(다음 노드)이 필요합니다. 신호는 위의 "배열"아이디어와 비슷하게 디자인 될 수 있습니다.
질문의 요점을 놓치고 있다고 생각합니다. 질문은 특별히 Memcached를 기본 데이터 저장소로 사용하여 Memcached에 대한 래퍼를 디자인 할 것을 요구하며, 1MB를 약간 넘는 값에서부터 기가 바이트까지의 값을 사용해야합니다. –