2013-06-10 1 views
2

내 문제를 해결해 줄 수 있습니까? 나는 느린 mysql 쿼리를 가지고 있으므로 결과를 memcache에 캐싱하고있다.memcache에 동시성 기록

$data = get_from_cache(); 
if (! $data) { 
    $data = get_from_mysql(); 
    set_cache($data); 
} 

문제 :

나는 이런 일을한다. 때때로 초당 약 10 건의 요청이 있습니다. 그래서, 내 캐시가 만료되면, 나는 5-10 get 요청을 동시에 느린 mysql 쿼리를 시작합니다.

mysql에 느린 요청을 하나만하기 위해 PHP에서 뮤텍스를 만들거나 이와 비슷한 패턴을 권장합니다.

답변

2

이것은 개 더미 문제로 알려져 있습니다.

해결 방법 1 : 캐시 아이템이 미래의 방법 아웃 시간 만료 설정

  • Strategy: Break Up The Memcache Dog Pile는 두 가지 방법을 설명합니다.
  • 값과 함께 직렬화 된 "실제"시간 초과를 포함시킵니다. 예를 들어 항목을 24 시간 내에 제한 시간으로 설정하지만 포함 된 제한 시간은 향후 5 분이 될 수 있습니다.
  • 캐시에서 가져올 때 오래된 시간 초과가 만료되고 만료되면 즉시 시간을 설정하고 그대로 데이터를 다시 저장하십시오. 이것은 위험의 창을 닫습니다.
  • DB에서 데이터를 가져 와서 캐시를 최신 값으로 업데이트하십시오.

해결 방법 2 : 일반 + 이전에 만료 오래된 키보다 약간 높은 만료 시간 주요 키

  • 는 memcached를 두 개의 키를 생성합니다.
  • get stale 키도 가져옵니다. 오래된 키가 만료 된 경우 다시 계산하여 부실 키를 다시 설정하십시오.