Frage

Das Setup: Strapazierter Website und eine Liste von Bild-URLs, die wir anzeigen möchten. Wir haben einen Bildpunkt, und jedes Element in dem Satz von Bild-URLs hat für den Tag ein Zielanzeige Prozentsatz. Beispiel:

  • Image1 - 10%
  • Image2 - 30%
  • Image3 - 60%

Da die Verkehrsmenge von Tag zu Tag variieren kann, ich bin die Prozentsatz innerhalb der Blöcke von 1000. tun müssen die Bilder auch zufällig ausgewählt werden, aber immer noch die Verteilung genau passen.

Frage: Ich habe in memcache, dies zu tun POC-Code implementiert, aber ich bin unwohl mit der Art und Weise Daten (mehrere Hash-Schlüssel von einem „Stammsatz“ mit Metadaten abgebildet) gespeichert sind. Dies muss auch in der Lage sein, auf eine Datenbank zurückgreifen, wenn der memcache Server ausfallen. Ich bin auch besorgt über Concurrency Probleme für den Stammsatz.

Gibt es einen einfacheren Weg, dies zu erreichen? Vielleicht eine schnelle mysql Abfrage oder ein besserer Weg memcache in diesen zu bringen?

Danke

Keine korrekte Lösung

Andere Tipps

Sie könnten das tun, was Sie gesagt haben, ein Block von 1000 Werte vorab generiert wird auf die Bilder zeigen Sie zurück:

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

speichert dann diesen Block in MySQL und memcache, und einen anderen Schlüssel verwenden (in beiden MySQL und memcache) den aktuellen Indexwert für die obige Zeichenfolge zu halten. Jedes Mal, wenn das Bild Skript wird der Wert in memcache getroffen erhöhen. Wenn memcache nach unten geht, gehen Sie zu MySQL statt. (UPDATE, dann SELECT, kann es ein besserer Weg, um diesen Teil zu tun)

Um memcache und MySQL synchron halten Sie einen cron-Job den aktuellen Indexwert von memcache zu MySQL kopieren könnten. Sie werden etwas an Genauigkeit verlieren, aber das kann in dieser Situation nicht kritisch sein.

Sie könnten speichern mehrere Distributionen sowohl MySQL und memcache und einen anderen Schlüssel haben, die auf die derzeit aktive Verteilung zeigt. Auf diese Weise können Sie zukünftige Bildblöcke vorab generiert wird. Wenn der Index die Verteilung überschreitet würde das Skript die Taste erhöhen und zum nächsten gehen.

Grob:

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

.. usw. Die Funktionsnamen Art stinken, aber ich denke, Sie bekommen die Idee. Wenn der memcache Server wieder nach oben ist, können Sie die Daten aus MySQL zurück zu memcache kopieren und es wird sofort wieder aktiviert.

Ein Treffer in der Datenbank wird höchstwahrscheinlich gehen länger dauern, so würde ich mit memcache bleiben. Sie werden mehr Probleme mit Parallelität als memcache mit MySQL haben. memcache ist besser gerüstet, viele Anfragen zu behandeln und wenn die Server nach unten gehen, das wird die wenigsten Sorgen auf einem hohen Traffic Website.

Vielleicht ein MySQL Experte kann mit einer guten Abfragestruktur Rohr hier, wenn Sie uns mehr Einzelheiten geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top