تختار مجموعة مقرها النسبة المئوية عالية الحركة؟

StackOverflow https://stackoverflow.com/questions/929916

سؤال

الإعداد: موقع حركة المرور العالي وقائمة عناوين URL للصورة التي نريد عرضها. لدينا بقعة واحدة صورة، ولكل عنصر في مجموعة عناوين URL من الصور له نسبة عرض مستهدفة لهذا اليوم. مثال:

  • image1 - 10٪
  • image2 - 30٪
  • image3 - 60٪

نظرا لأن مبلغ المرور قد يختلف من يوم إلى آخر، أفعل النسب المئوية داخل كتل 1000. تحتاج الصور أيضا إلى اختيارها بشكل عشوائي، ولكن لا تزال تناسب التوزيع بدقة.

سؤال: لقد قمت بتنفيذ رمز POC للقيام بذلك في MemCache، لكنني غير مرتاح مع الطريقة التي يتم فيها تخزين البيانات (مفاتيح التجزئة المتعددة المعينة بواسطة "سجل رئيسي" مع بيانات التعريف). يجب أن يكون هذا أيضا أن يكون قادرا على العودة إلى قاعدة بيانات إذا انخفضت خوادم MemCache. أنا قلق أيضا إزاء قضايا التزامن للسجل الرئيسي.

هل هناك طريقة أبسط لإنجاز هذا؟ ربما استفسار mysql سريع أو طريقة أفضل لجلب memcache إلى هذا؟

شكرا

لا يوجد حل صحيح

نصائح أخرى

يمكنك أن تفعل ما قلته، ثم تحظى بمنح كتلة من 1000 قيم تشير إلى الصور التي سترجعها:

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

ثم قم بتخزين هذه الكتلة في MySQL و MemCache، واستخدم مفتاح آخر (في كل من MySQL و MEMCACHE) لعقد قيمة الفهرس الحالية للسلسلة المذكورة أعلاه. كلما وصل البرنامج النصي للصورة زيادة القيمة في memcache. إذا انخفض memcache، انتقل إلى MySQL بدلا من ذلك (تحديث، ثم حدد؛ قد تكون هناك طريقة أفضل للقيام بهذا الجزء).

للحفاظ على memcache و mysql في المزامنة، يمكن أن يكون لديك وظيفة كرون نسخ قيمة الفهرس الحالية من 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 ويتم إعادة تنشيطها على الفور.

من المرجح أن يستغرق ضربة لقاعدة البيانات وقتا أطول حتى أتزط بالاجاشاش. سوف تحصل على مزيد من المشكلات مع التزامن باستخدام MySQL من MEMCACHE. تم تجهيز MEMCACHER بشكل أفضل للتعامل مع الكثير من الطلبات، وإذا انخفضت الخوادم، فسيكون هذا أقل ما يقلقك في موقع مرور مرتفع.

ربما يمكن أن يكون خبير MySQL أن ينجذب هنا بنية استعلام جيدة إذا كنت تعطينا المزيد من التفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top