Domanda

Il setup: sito alto traffico e un elenco di URL di immagine che vogliamo visualizzare. Abbiamo un punto di immagini, e ogni elemento del set di URL immagine ha una percentuale di visualizzazione di destinazione per la giornata. Esempio:

  • Image 1 - 10%
  • Image2 - 30%
  • Image3 - 60%

Poiché la quantità di traffico può variare da un giorno all'altro, sto facendo le percentuali all'interno dei blocchi di 1000. Le immagini devono anche essere scelto in modo casuale, ma ancora in forma, distribuiti in modo accurato.

Domanda: Ho implementato il codice POC per fare questo in memcache, ma sono a disagio con i dati modo in cui vengono memorizzati (più chiavi hash mappate da un "master record" con metadati). Questo ha anche bisogno di essere in grado di ripiegare a un database se i server memcache vanno giù. Sono anche preoccupato per problemi di concorrenza per il record master.

C'è un modo più semplice per ottenere questo risultato? Forse una query mysql veloce o un modo migliore per portare memcache in questo?

Grazie

Nessuna soluzione corretta

Altri suggerimenti

Si potrebbe fare quello che hai detto, pregenerate un blocco di 1000 valori indicando le immagini tornerete:

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

Poi conservarlo quel blocco in MySQL e memcache, e utilizzare un'altra chiave (sia MySQL e memcache) per mantenere il valore dell'indice corrente per la stringa di cui sopra. Ogni volta che lo script immagine viene colpito incrementare il valore in memcache. Se memcache va giù, andare a MySQL, invece. (UPDATE, quindi selezionare, ci può essere un modo migliore per fare questa parte)

Per mantenere memcache e MySQL in sincronia si potrebbe avere un job cron copiare il valore dell'indice corrente da memcache a MySQL. Potrai perdere un po 'di precisione, ma che potrebbe non essere fondamentale in questa situazione.

È possibile memorizzare diverse distribuzioni sia in MySQL e memcache e hanno un altro tasto che punta alla distribuzione attualmente attivo. In questo modo è possibile pregenerate blocchi di immagine future. Quando l'indice supera la distribuzione lo script sarebbe incrementare la chiave ed andare a quella successiva.

Approssimativamente:

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;
}

.. ecc I nomi delle funzioni tipo di puzzano, ma penso che si ottiene l'idea. Quando il server memcache è tornato di nuovo, è possibile copiare i dati da MySQL torna a memcache e viene immediatamente riattivato.

Un colpo alla banca dati è probabilmente andando a prendere più a lungo quindi vorrei bastone con memcache. Si sta per avere più problemi con la concorrenza usando MySQL che memcache. memcache è meglio attrezzata per gestire un sacco di richieste e se i server vanno giù, questo sta per essere l'ultima delle vostre preoccupazioni su un sito web ad alto traffico.

Forse un esperto di MySQL può pipa in qui con una buona struttura di query se ci date più specifiche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top