문제

설정 : 높은 트래픽 웹 사이트 및 표시하려는 이미지 URL 목록. 이미지 지점이 하나 있고 이미지 URL 세트의 각 항목에는 오늘의 대상 표시 비율이 있습니다. 예시:

  • 이미지 1-10%
  • image2-30%
  • image3-60%

트래픽 금액은 매일 다를 수 있기 때문에 1000 블록 내에서 백분율을 수행하고 있습니다. 이미지도 무작위로 선택해야하지만 여전히 분포에 정확하게 맞습니다.

질문 : Memcache 에서이 작업을 수행하기위한 POC 코드를 구현했지만 데이터가 저장되는 방식이 불편합니다 (메타 데이터와 함께 "마스터 레코드"에 의해 맵핑 된 다중 해시 키). Memcache 서버가 다운되면 데이터베이스로 돌아갈 수 있어야합니다. 또한 마스터 레코드의 동시성 문제에 대해 걱정하고 있습니다.

이것을 달성하는 더 간단한 방법이 있습니까? 아마도 빠른 MySQL 쿼리 또는 이것에 memcache를 가져 오는 더 좋은 방법일까요?

감사

올바른 솔루션이 없습니다

다른 팁

당신은 당신이 말한 것을 할 수 있고, 당신이 반환 할 이미지를 가리키는 1000 값의 블록을 미리 유도 할 수 있습니다.

$distribution = "011022201111202102100120 ..." # exactly evenly distributed

그런 다음 해당 블록을 MySQL 및 Memcache에 저장하고 다른 키 (MySQL 및 Memcache 모두)를 사용하여 위의 문자열의 현재 색인 값을 유지하십시오. 이미지 스크립트가 닿을 때마다 Memcache의 값이 증가합니다. Memcache가 다운되면 대신 MySQL로 이동하십시오 (업데이트하고 선택하십시오.이 부분을 수행하는 더 좋은 방법이있을 수 있습니다).

Memcache와 MySQL을 동기화하려면 CRON 작업이 Memcache에서 MySQL로 현재 색인 값을 복사 할 수 있습니다. 약간의 정확성을 잃을 수 있지만이 상황에서는 중요하지 않을 수 있습니다.

MySQL과 Memcache에 여러 분포를 저장하고 현재 활성 분포를 가리키는 또 다른 키가있을 수 있습니다. 이렇게하면 미래의 이미지 블록을 선사시킬 수 있습니다. 인덱스가 분포를 초과하면 스크립트가 키를 증가시키고 다음 스크립트로 이동합니다.

대충:

function FetchImageFname( )
{
  $images = array( 0 => 'image1.jpg', 1 => 'image2.jpg', 2 => 'image3.jpg' );
  $distribution = FetchDistribution( );
  $currentindex = FetchCurrentIndex( );

  $x = 0;
  while( $distribution[$currentindex] == '' && $x < 10 );
  {
    IncrementCurrentDistribKey( );
    $distribution = FetchDistribution( );
    $currentindex = FetchCurrentIndex( );
    $x++;
  }

  if( $distribution[$currentindex] == '' )
  {
    // XXX Tried and failed. Send error to central logs.
    return( $images[0] );
  }

  return( $distribution[$currentindex] );
}

function FetchDistribution( )
{
  $current_distib_key = FetchCurrentDistribKey( );
  $distribution = FetchFromMemcache( $current_distrib_key );
  if( !$distribution )
    $distribution = FetchFromMySQL( $current_distrib_key );
  return $distribution;
}

function FetchCurrentIndex( )
{
  $current_index = MemcacheIncrement( 'foo' );
  if( $current_index === false )
    $current_index = MySQLIncrement( 'foo' );
  return $current_index;
}

.. Memcache 서버가 다시 백업되면 MySQL에서 Memcache로 데이터를 복사 할 수 있으며 즉시 재 활성화됩니다.

데이터베이스에 대한 인기는 더 오래 걸릴 가능성이 높으므로 memcache를 고수 할 것입니다. Memcache보다 MySQL을 사용하여 동시성에 더 많은 문제가 생길 것입니다. Memcache는 많은 요청을 처리 할 수있는 장비가 더 잘 갖추어져 있으며 서버가 다운되면 높은 트래픽 웹 사이트에서 걱정이 가장 적습니다.

어쩌면 MySQL 전문가가 더 많은 구체적인 내용을 제공하면 좋은 쿼리 구조로 여기에 파이프 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top