2013-05-31 2 views
1

저는 현재 MySQL과 iMagick을 사용하여 이미지 갤러리를 만들고 있습니다. 각 이미지는 imageMagick을 통해 업로드되고 파일 이름과 확장명은 MySQL DB에 PID, filename, extension 형식으로 저장됩니다. 나는 아래의 코드 페이지 벌금 모든 이미지를 인쇄하기 위해 DB를 통해 반복 할 수memcached를 올바른 방법으로 사용하고 있습니까?

$gallerySQL = mysqli_query($connection, "SELECT * FROM gallery"); 
while($row = mysqli_fetch_array($gallerySQL)){ 
    $file = $row['filename'].$row['ext']; 
    $thumb = $row['filename']."-thumb.png"; 
    $blur = $row['filename']."-thumbB.png"; 
    ?> 
    <a href="<?php echo $file ?>"><img src="<?php echo $thumb ?>" onmouseover="this.src='<?php echo $blur ?>'" onmouseout="this.src='<?php echo $thumb ?>'" alt="Loaded from DB" /></a> 
    <?php 
} 
?> 

는 그러나, 나는 확실하지 오전이에 memcached를 구현하는 방법. 이미지 갤러리는 자주 바뀌지 않으므로 페이지가로드 될 때마다 여러 개의 DB 히트를 차지하는 대신 캐싱에 적합한 후보로 보인다. 이 작업을 수행하는 내가 작성한 코드는 다음과 같습니다

$num = 0; 
$key = "img_".$num; 
$pics = mysqli_query($connection, "SELECT * FROM gallery"); 

while($num<4){ 
while($row = mysqli_fetch_array($pics)){ 
    $key = "img_".$num; 
    if(!$mem->get($key)){ 

     $file = $row['filename'].$row['ext']; 
     $thumb = $row['filename']."-thumb.png"; 
     $blur = $row['filename']."-thumbB.png"; 
     ?> 
     <a href="<?php echo $file; ?>"><img src="<?php echo $thumb ?>" onmouseover="this.src='<?php echo $blur ?>'" onmouseout="this.src='<?php echo $thumb ?>'" alt="Loaded from DB" /></a> 
     <?php 

     $key = "img_".$num; 
     $mem->add($key, $row['filename']); 

     $key = "ext_".$num; 
     $mem->add($key, $row['ext']); 

    } else { 
     $key = "img_".$num; 
     $file = $mem->get($key); 
     $key = "ext_".$num; 
     $ext = $mem->get($key); 
     ?> 
     <a href="<?php echo $file.$ext; ?>"><img src="<?php echo $file."-thumb.png" ?>" onmouseover="this.src='<?php echo $file."-thumbB.png" ?>'" onmouseout="this.src='<?php echo $file."-thumb.png" ?>'" alt="Loaded from MemCached" /></a> 
     <?php 
    } 
    $num++; 
} // end while(row) 
}// end while(num) 
?> 

이 잘 작동, 또는 그렇게 보인다,하지만 난 memcached를에 많은 자습서를 찾을 수 없습니다 (대부분에서 Memcache에있을 것 같다) 그래서 아니에요 만약 내가 올바른 방향으로 가고 있는지, 아니면 도구를 완전히 잘못된 방식으로 사용하고 있는지. 키가 얼마나 높아야 하는지를 추적하는 가장 좋은 방법은 무엇입니까? 지금까지 내가로드해야하는 이미지의 수는 4 가지로 하드 코딩되었지만 올바른 솔루션이 아닌 것은 분명합니다.

내 사용법에 대한 비판을 받고, 권장 튜토리얼에 대한 링크를 얻을 수 있다면 좋을 것입니다. 나는이 작업을 만드는 방법을 함께 해킹하는 것처럼 느껴진다. memcached 버전은 테이블을 사용하여 웹 페이지를 배치한다.

답변

0

캐시 사용법은 매우 간단합니다 :

  1. 체크 캐시 아이템을 제공,
  2. 존재하지 않는 경우 항목을 찾으 페치 (또는 생성) 및 캐시
  3. 에 넣어

캐시를 채우는 세 가지 방법을 생각해 볼 수 있으며 캐시되는 데이터에 따라 전략을 선택할 수 있습니다 (데이터의 양, 데이터를 찾고 준비하는 데 걸리는 시간, 사용 빈도, "잘"그것이 c 일 수있는 방법 통증).

첫번째 전략은 데이터의 작성 공정을 얻어 때위한 한번에 모든 항목을 가져 한번에 여러 항목을 인출 한 번에 한 항목을 가져 양은 시간과 데이터가 "잘"캐시 가능합니다 (캐시에서 적절한 시간 동안 유지 될 수 있음). 캐시 항목을 만드는 데 시간이 오래 걸릴 수 있으며 이후 호출은 캐시에서 데이터를 찾아 매우 빠릅니다.

두 번째 전략은 많은 양의 캐시 가능한 레코드가 있고 재사용 가능한 시간에 하위 집합을 결정할 수 있으며 데이터가 자주 변경되지 않는 경우입니다 ("잘 캐시 가능"). 이 전략은 "이 ID와 다음 10 개를 가져 오는 것"과 같이 예상 할 수있는 항목을 미리 가져 오는 데에도 사용할 수 있습니다.

세 번째 전략은 소량의 항목 만 갖고 있지만 자주 액세스하는 경우 유용합니다. 이 방법으로 데이터베이스에서 많은 부하를 제거 할 수 있습니다 (데이터가 분당 1000 회 사용된다고 상상해보십시오. 단 1 회만 캐시하면 쿼리의 양이 1000 대신 1로 줄어 듭니다). 항목이 캐시에서 누락 될 때마다 모든 것을 새로 고칩니다.

사례로 가져 가려면 전략 3을 권하고 싶습니다.

원하는 항목의 캐시를 확인하십시오. 그것이 존재하지 않으면, 모든 항목에 대해 고유 한 키를 사용하여 모든 항목을 캐시에 저장하십시오 (그리고 요청한 항목을 선택하는 것을 잊지 마십시오). 후속 조회에서 모든 단일 레코드를 찾아서 캐시에서 제공해야합니다.

관련 문제