设置:高流量网站和一系列的图像的网址,我们希望显示。我们有一个图像的地点,以及每个项目的所设置的图像的网址有一个目标百分比显示的一天。例如:

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

因为交通量可以从每一天,我做的是百分比内块1000。图像还需要将随机挑选的,但仍然适合分配准确。

问题:我已经实现POC的代码这样做在缓存,但是我不舒服的方式存储数据(多哈键映由一个"主记录"与元数据)。这还需要能够回到一个数据库,如果缓存服务器下去。我还感到关切的并发问题的主记录。

是有一个简单的方法来完成这个吗?也许快速mysql查询或者更好的方式把缓存入这个吗?

感谢

没有正确的解决方案

其他提示

你能做的你说什么,来预生成的框1000值指向的图像你会回报:

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

然后储存,阻止在MySQL和缓存和使用的另一个关键(在两MySQL和缓存)保持目前的指数值为上述串。每当的图像脚本是打增加值在缓存.如果缓存下去,去MySQL而不是(更新,然后选择;可能有一个更好的方式来做到这一点部分)。

保持缓存和MySQL在同步,你可以有一个计划的工作复制目前的指数值缓存to MySQL.你会失去一些准确性,但这可能不是关键,在这种情况。

你可以存储多分布在这两个MySQL和缓存和拥有的另一个关键点的当前活动的分布。这样你可以来预生成未来的图像块。当指标超出所分配的脚本中将增加关键和转到下一个。

大致为:

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

..等等。该职能名称的那种臭味,但我认为你会得到的想法。当缓存服务器又回来了,你可以复制的数据MySQL回到缓存这是立即重新启动。

一击中的数据库最有可能会需要更长的时间,所以我会坚持下缓存.你要有更多的问题,并发使用MySQL于缓存.缓存是更好地处理了很多的请求,如果服务器下去,这将是你最担心的一个高流量网站。

也许MySQL专家可以管在这里有一个很好的查询结构,如果你给我们更多的细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top