Memcached奇怪的问题!

时间:2010-12-09 13:58:37

标签: php mysql memcached

我有一个250K DAU的Facebook应用程序。我使用Memcached来缓存文件和MySql选择,因为没有它我的服务器会变得疯狂。

我已经设置了这样的代码:

$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");

// FOR FILES

$doc = $memcache->get('mem_index_html');

if ($doc == null)
{
    $doc = new Document( HTML.'index.html' );
    $memcache->set('mem_index_html', $doc, 0, 86400);
}

// FOR SQL

$sql=sprintf('count(qtn_id) FROM tb_questions where qtn_lang="EN"));
$total_pages = $memcache->get($sql);

if ($total_pages == null)
{       
    $query_id = DB::query($sql);        
    list( $total_pages ) = DB::nextRow( $query_id );
    DB::free( $query_id );
    $memcache->set($sql, $total_pages, 0, 86400);
}

问题是经过一段时间 - 通常是24小时后,错误开始出现。没有创建日志,但如果我尝试重新加载页面,则会收到超时。我认为那个时刻有很多流量,Memcached工作不正常,一切都在慢下来。 我的临时解决方案是刷新内存缓存 - $memcache->flush(),,但这不是一个好的解决方案。

我做错了吗?有什么可以优化或我不知道。我发现通过网络搜索http://code.google.com/p/memcached/wiki/TutorialCachingStory关于制作更多的Memecached服务器。这是最好的解决方案吗?

感谢您的回答。

达科

1 个答案:

答案 0 :(得分:1)

$ memcache-> set命令中的第四个参数表示到期超时。超过此值后,存储的对象将不再可用。由于您将其设置为24小时,因此在此期间后将无法使用,除非您更新它们。

如果expiry参数设置为0,则该项永远不会过期,但如果memcached已填满并且需要释放一些空间,它仍然可以删除。

如果该值小于30天(30 * 24 * 3600 = 2592000),则提供的值将被视为与当前时间的偏移量。

如果该值大于该值,则将其解释为绝对时间。