2009-09-01 8 views
1

1 (선택됨) 또는 0 (선택되지 않음) 인 16 개의 필터 옵션이있는 양식을 사용하는 검색 응용 프로그램에서 작업하고 있습니다. 결과는 JSON은 AJAX를 통해 GET 요청을 사용하여 검색됩니다.많은 매개 변수를 기반으로 캐시하는 방법

쿼리 스트링은 다음과 같다 :

FILTER_1 = 0 & filter_2 = 1 ... 생략 ... & filter_16 = 1 & 페이지 = 20

각각의 SearchResult가 갖는 적어도 2 페이지를 한 사용자가 탐색 할 수 있습니다.

내 질문은 : 어떻게 입력 된 매개 변수를 기반으로 검색 결과를 캐시 할 수 있습니까? 내 첫 번째 아이디어는 요청 매개 변수를 md5하고 해시를 파일 이름으로 사용하여 캐시 파일을 작성하는 것이 었습니다.

새 요청이 들어올 때마다 캐시 파일을 검색하고 캐시 파일이 있으면 데이터베이스를 쿼리하고 행을 json 결과로 변환하는 대신 해당 파일의 데이터를 사용합니다.

그러나 이것은 많은 검색 옵션 때문에 좋지 않은 것처럼 보입니다. 꽤 많은 캐시 파일 (16 * 16 ???)이있을 것이고 응용 프로그램이 소수의 사용자에 의해서만 사용되기 때문에 모든 가능한 조합이 캐시 될 것입니다. 각 결과에는 X 페이지가 포함되어 있으므로 각 페이지는 자체 캐시 파일 (16 * 16 * X)이됩니다.

이와 같은 응용 프로그램에 적합한 캐싱 전략은 무엇입니까? 캐시를 구현할 수 있습니까?

답변

1

검색 매개 변수는 모두 0 또는 1 일 수있는 플래그이므로 비트 마스킹을 고려할 수 있습니다.

2의 힘 값을 나타낼 것이라고하여 필터의 각 : PHP의 bitwise operators를 사용하여

$filter_1 = 1; 
$filter_2 = 2; 
$filter_3 = 4; 
... 
$filter_8 = 256; 
... 
$filter_16 = 65536; 

를 쉽게 하나의 정수에 16 개 필터 값을 저장할 수 있습니다. 예를 들어, 값 "257"은 filter_1과 filter_8의 조합을 사용해야 만 도달 할 수 있습니다.사용자가 선택한 FILTER_1 및 filter_8 경우 수행하여 비트 마스크를 결정할 수있다 : 모든 필터의 상태를 나타내는 고유의 비트 마스크와

$bitmask = $filter_1 | $filter_8 //gives 257 

을, 당신은 단순히 비싼으로, 그 캐시 키로도 사용할 수 있습니다 md5 작업이 필요합니다. 따라서이 경우 "257"이라는 파일을 캐시에 저장합니다.

이 기술을 사용하면 새로운 레코드와 업데이트 된 레코드를 확인하여 일치하는 필터를 확인하고 해당 이름에 "비트"가 설정된 파일을 삭제할 수 있으므로 캐시를 무효화 할 수있는 쉬운 도구가 제공됩니다. 즉 . if (((int)$filename) & $filter == $filter) unlink($filename);. 테이블에 쓰기 작업이 자주 발생하면 캐시를 검색 할 때 성능 문제가 발생할 수 있지만 읽기가 많은 응용 프로그램의 경우 적절한 기술입니다.

이것은 비트 또는 플래그를 다룰 때 사용하는 방법입니다. 그러나 이와 같이 캐싱이 정말로 필요한지 신중하게 고려해야합니다. 시스템 사용자가 적 으면 몇 가지 검색어를 기반으로 성능 문제가 실제로 발생합니까? 뿐만 아니라, MySQL에는 내장 된 쿼리 캐싱 기능이있어 읽기가 잘되는 응용 프로그램에서 매우 잘 수행됩니다. 결과 페이지 생성 루틴이 비싸다면, 출력 단편을 캐싱하는 것이 도움이 될 수 있습니다. 그러나 소수의 사용자를 대상으로 한 마이크로 초의 성능에 대해서만 이야기한다면 가치가 없을 것입니다.

1

왜 캐시가 필요합니까?

앱이 소수의 사용자 만 사용하는 경우 캐싱이 실제로 필요하지 않을 수 있습니다.

0

(적은 수의 사용자) 요구 사항을 감안할 때 모든 조합을 캐시하면 합리적인 것처럼 보입니다. 물론 캐싱이 전혀 의미가 없다면 말입니다. 일반적인 쿼리에는 어느 정도의 시간이 걸립니까? 응용 프로그램이 여러 사람에 의해서만 사용된다고 했으므로 캐싱 할 가치가 있습니까? 내 매우 대략적인 견해는 쿼리가이 경우 몇 초가 걸리는 경우 캐싱에 대해 걱정할 필요가 없다는 것입니다. 1 초 미만이고 응용 프로그램의 응답 성을 좋게 만들고 싶지 않으면 캐싱이 필요하지 않습니다.

그렇지 않으면 모든 조합을 캐싱해도 괜찮습니다. 매우 많은 수의 파일이 사용 되더라도 여전히 파일이 65536 개까지 존재하며 대부분의 최신 운영 체제는 디렉토리에있는 수천 개의 파일을 쉽게 처리 할 수 ​​있습니다 (파일에 캐시하려는 경우). 그러나 어떤 경우에도 캐시의 항목 수를 제한하고 오래된 항목을 정기적으로 제거하는 것이 타당합니다. 또한 MD5를 사용하지 않고 필터의 0과 1을 캐시 키 (예 : 0101100010010100)에 연결합니다.

0

먼저 캐시가 필요한지 확인하십시오 (예 : Toby 제안).

그런 다음 정보가 얼마나 신선해야하는지 생각해보십시오. 오래된 값을 플러시 할 필요가 있습니다. memcached과 같은 기존 솔루션을 사용할 수 있습니다.

$key = calc_key(); 

$result = $memcache->get($key); 

if (!$result) { 
    $result = get_data_from_db(); 
    /* cache result for 3600 seconds == 1 hour */ 
    $memcache->set($key, $result, 0, 3600); 
} 

/* use $result */ 
관련 문제