Yüksek trafik yüzdesi tabanlı set alır?

2 Cevap php

Kurulum: Yüksek trafik web sitesi ve görüntülemek istediğiniz resim URL'leri bir liste. Biz bir görüntü nokta var, ve resim URL'leri kümesindeki her öğe gün için bir hedef görüntü yüzdesi var. Örnek:

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

Trafik miktarı günden güne değişebilir çünkü ben 1000 blokları içinde yüzdeleri yapıyorum. Görüntüleri de rastgele seçilmiş olması gerekir, ama yine de doğru dağılımını uygun.

Soru: Ben memcache bu iş için POC kodu uyguladık, ama ben verilerin depolandığı şekilde (meta veri ile "master kaydı" ile eşleştirilmiş birden fazla karma anahtarları) ile rahatsız değilim. Bu da memcache sunucuları aşağı giderseniz bir veritabanına geri düşmek mümkün olmalıdır. Ben de ana kayıt için eşzamanlılık sorunlar hakkında endişeliyim.

Bunu gerçekleştirmek için basit bir yolu var mı? Belki de hızlı bir mysql sorgu ya da bu içine memcache getirmek için daha iyi bir yolu?

Teşekkürler

2 Cevap

Ne dediğini yapabilirsin, dönersiniz görüntülere işaret 1.000 değerlerin bir blok pregenerate:

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

Sonra MySQL ve memcache bu bloğu depolamak ve yukarıdaki dize için geçerli dizin değeri tutmak için (MySQL ve memcache hem de) başka bir anahtar kullanın. Görüntü komut isabet olduğunda memcache değerini artırmak. Memcache aşağı giderse, (sonra SELECT, UPDATE, bu kısmını yapmak için daha iyi bir yolu olabilir) MySQL yerine gidin.

Senkronize memcache ve MySQL tutmak için bir cron işi MySQL memcache güncel indeks değerini kopyalayın olabilir. Bazı doğruluğunu kaybedersiniz ama bu durumda kritik olmayabilir.

MySQL ve memcache hem de çeşitli dağıtımları saklamak ve şu anda aktif dağıtım işaret başka bir anahtar olabilir. Eğer gelecekte görüntü blokları pregenerate edebilirsiniz. Endeks dağılımını aştığında komut tuşuna artırmak ve sonraki birine gitmek istiyorum.

Kabaca:

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

Vs .. işlev adları tür kıyameti, ama fikir alırsınız düşünüyorum. Memcache sunucusu tekrar yukarı olduğunda, geri memcache için MySQL veri kopyalamak ve anında aktive edilir.

Veritabanına bir hit büyük olasılıkla bu yüzden memcache ile sopa uzun sürecekse. Sen memcache daha MySQL kullanarak eşzamanlılık daha fazla sorunları var olacak. memcache daha birçok istek işlemek için donanımlı ve sunucuları aşağı giderseniz, bu bir yüksek trafik web sitesinde endişeler az olacak.

Belki burada iyi bir sorgu yapısı ile MySQL uzman kutu boru bize daha fazla detay vermek durumunda.