Pregunta

La configuración: sitio web de alto tráfico y una lista de URL de imagen que queremos mostrar. Tenemos un punto de la imagen, y cada elemento en el conjunto de URL de imágenes tiene un porcentaje de visualización de destino para el día. Ejemplo:

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

Debido a la cantidad de tráfico puede variar de un día a otro, estoy haciendo los porcentajes dentro de los bloques de 1000. Las imágenes también deben ser recogidos al azar, pero aún se ajustan con precisión la distribución.

Pregunta: He implementado código de POC para hacer esto en Memcache, pero estoy incómodo con la forma de datos se almacena (múltiples claves hash mapeados por un "registro maestro" con metadatos). Esto también tiene que ser capaz de caer de nuevo a una base de datos si los servidores memcache bajan. También estoy preocupado por los problemas de simultaneidad en el registro maestro.

¿Hay una manera más sencilla de lograr esto? Tal vez una consulta MySQL rápido o una mejor manera de llevar memcache en esto?

Gracias

No hay solución correcta

Otros consejos

Usted puede hacer lo que ha dicho, pregenerate un bloque de valores de 1000 apuntando a las imágenes que va a regresar:

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

A continuación, almacenar ese bloque en MySQL y Memcache, y utilizar otra clave (tanto en MySQL y Memcache) para mantener el valor del índice actual de la cadena anterior. Cada vez que se golpea el guión imagen incrementar el valor en Memcache. Si Memcache baja, vaya a MySQL en su lugar. (UPDATE, a continuación, SELECT, puede haber una mejor manera de hacer esta parte)

Para mantener Memcache y MySQL en sincronía usted podría tener una tarea programada copiar el valor actual del índice de Memcache a MySQL. Vas a perder cierta precisión, pero que pueden no ser crítico en esta situación.

Se puede almacenar múltiples distribuciones en tanto MySQL y Memcache y tienen otra tecla que apunta a la distribución activa en ese momento. De esa manera usted puede pregenerate futuros bloques de imágenes. Cuando el índice es superior a la distribución de la secuencia de comandos incrementaría la llave y vaya a la siguiente.

A grandes rasgos:

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

.. etc. Los nombres de función tipo de mal olor, pero creo que obtendrá la idea. Cuando el servidor memcache está de vuelta otra vez, puede copiar los datos de MySQL de nuevo a Memcache y se reactiva al instante.

Un golpe a la base de datos es más probable que va a tomar más tiempo, así que se pegaba con Memcache. Usted va a tener más problemas con el uso de MySQL concurrencia de Memcache. Memcache está mejor equipado para manejar una gran cantidad de solicitudes y si los servidores bajan, esto va a ser el menor de sus preocupaciones en un sitio web de alto tráfico.

Tal vez un experto en MySQL puede tubería de aquí con una buena estructura de consulta si nos dan más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top