2011-12-08 4 views
2

내 응용 프로그램에 memcached 레이어를 추가하기 시작했습니다. 여태까지는 그런대로 잘됐다.캐시를 무효화하기위한 PHP Memcached 키 및 버전 번호 증가 - 어떻게?

그러나 나는 데이터를 관련성있게 유지하기 위해 누군가 파일을 사이트에 업로드 할 때 대량의 대량 배치를 무효화/삭제해야 할 필요가 있음을 깨달았습니다.

나는이 문제를 해결하는 가장 일반적인 방법은 각 키에 버전 번호를 설정하는 것인데, 사용자가 업로드 할 때 키를 삭제하는 것보다는 (많은 순열이있을 수 있기 때문에) 다음에 데이터에 액세스 할 때 캐시 실패를 유도하여 버전 번호를 증가시킵니다.

이 코드를 얻기 위해 어디서부터 시작해야할지 모르겠다. 나는 어쨌든 내 머리를 완벽하게 이해하고있다.

내 코드는 현재 다음과 같다 : -

$memcache = new Memcache; 


$memcache->connect('localhost', 11211) or die ("Could not connect"); 


$key = md5("songsearch_$textSearch.$rangeSearch"); 

위 차례로 JSON 많은 양의를 검색하는 GET 요청에서 검색되는 키 VAR의 두 변수. (제품 카탈로그를 생각해 보라).

이 변수는 이러한 변수에 따라 동적으로 결합되는 쿼리 자체를 결정합니다. 궁극적으로이 모든 것들이 동일한 스크립트에서 생성 된 수백 개의 키를 가질 수있을지라도 모든 개별 쿼리에 고유 한 키를 제공합니다.

위의 내용이 확실 할 경우, 제 질문에 대한 대답을 돕기 위해 어떤 점을 명확히 해달라고 부탁드립니다. 내가 JSON을 인코딩하기 직전

$memcache->set($key, $output, MEMCACHE_COMPRESSED, time() + 24*60*60*365); 

- :

분명히 나중에 캐시에게 내가 이것을 사용하고 결과를 설정합니다.

내 질문은 정말입니다 ... 어떻게 증분 버전 관리를 추가하여 사용자가 파일을 업로드하면이 스크립트에서 생성 된 전체 키를 무효화 할 수 있습니까?

나를 올바른 길로 인도하는 사람에게 거대한 감사드립니다.

+0

그 바보 : 당신은 단순히 당신의 스크립트를 수정 것, 그래서 지금

class VersionedMemcache extends Memcache { const VERSION_KEY = 'version_number'; private $version = 1; public function __construct() { $version = parent :: get(self :: VERSION_KEY); if ($version === false) { $version = 1; $this->set(self :: VERSION_KEY, $version); } $this->version = $version; } public function get($key, &$flags = null) { $key = $key . '_v' . $this->version; return parent :: get($key, $flags); } public function incVersion() { $this->version = $this->increment(self :: VERSION_KEY); return $this->version; } } 

:

는 액세스를 단순화하기 위해, 당신이 (검증되지 않은) 새로운 Memcache의 핸들러 클래스에이 포장 추천 memcache는 와일드 카드에서 삭제하도록 허용하지 않습니다. 일부 상수 키 접두사와 일치하는 모든 캐시 항목을 플러시하기가 쉽습니다. 'cache_key_related_to_group_of_values ​​*' –

+0

더 동의하지 못했습니다 ... 더 강력하고 쉽게 작업 할 수 있습니다. :-( – gordyr

답변

9

분명히 올바른 길을 가고 있습니다. 누락 된 유일한 것 : 키를 만들기 전에 검색하는 Memcache에 버전 번호를 저장하십시오. 잘못된 항목으로 실행

$memcache->increment('version_number'); 

이 자동으로 리드 기존의 모든 쿼리 : 누군가가 새로운 콘텐츠를 업로드 할 때마다

$memcache = new Memcache; 
$memcache->connect('localhost', 11211) or die ("Could not connect"); 

// fetch the current version number 
$version = $memcache->get('version_number'); 

// and add the version to the key 
$key = md5("songsearch_$textSearch.$rangeSearch") . 'v' . $version; 

그래서 지금, 당신은 단순히 버전 번호를 증가.

$memcache = new VersionedMemcache(); 

$memcache->connect('localhost', 11211) or die ("Could not connect"); 

$key = md5("songsearch_$textSearch.$rangeSearch"); 

// this will now result in a fetch on 'ab23...232afe_v1' instead of 'ab23...232afe' 
$result = $memcache->get($key); 

// when an upload happens, simply 
$memcache->incVersion(); 
+1

절대적으로 환상적인 답장입니다. 모든 훌륭한 예제 코드와 훌륭한 설명으로 자세히 다뤘습니다. anks! – gordyr

+0

기꺼이 도와 드리겠습니다! –

+0

와우, 나는 재미있는 문제를 너무 많이 열람했다. 이것은 가장 흥미롭고 강력한 대답이다. 나는 잠시 들어갔다. 나는 많은 것을 배웠다! – Landon

0

배열을 저장하고 지옥을 피할 수 있습니다.

+0

제안 sathia 주셔서 감사합니다. 나는 memcached와 함께 일하는 것에 아주 익숙하기 때문에 좀 더 자세히 설명해 주실 수 있을지 궁금합니다. 어떻게 도움이되는지, 구현하는 방법에 대해서는 잘 모르겠습니다. 감사합니다. 감사합니다. ! – gordyr

+1

안녕하세요, 저는 하나의 키를 사용하여 키 => 배열의 배열을 저장할 수 있다고 제안했습니다.이 경우 하나의 키를 무효화 할 수 있고 그 안에있는 모든 키/값에 반영됩니다. 훨씬 적은 오버 헤드를이 방법으로 볼 수 있고 투명하다. (PHP의 경우 memcache 라이브러리에서 모두 처리한다.) – sathia

+1

실제로 Cassy의 해결책이 있고 현재 작동하고 있으며 그의 대답의 품질이 뛰어났다. 이것은 훌륭한 팁이며 분명히 내가 사용할 방법이 될 것입니다. 매우 감사합니다. – gordyr