【问题标题】:Memcached weird problem!Memcached 奇怪的问题!
【发布时间】:2010-12-09 13:58:37
【问题描述】:

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

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

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

// 用于文件

$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 服务器。这是最好的解决方案吗?

感谢您的回答。

达科

【问题讨论】:

  • 暂时的并不意味着暂时的。这意味着与时间有关。同根不同义。

标签: php mysql memcached


【解决方案1】:

$memcache->set 命令中的第四个参数代表过期超时。一旦超过此值,存储的对象将不再可用。由于您将其设置为 24 小时,除非您更新它们,否则它们将在该时间段后不可用。

如果expiry参数设置为0,则item永远不会过期,但是如果memcached满了需要释放一些空间还是可以删除的。

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

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

【讨论】:

  • 嗨,克里斯,感谢您的回答。问题是我尝试了两种方式:编号为 86400 和 0。但在这两种情况下,大约 24 小时后出现问题,我必须刷新 memcached 才能开始工作。我现在的问题是:1)如何在不重新启动服务器的情况下释放 memcached 内存? 2) Memcached 对文件 (php/html) 有用还是仅对 MySql 有用? 3)我看到很多使用 md5 的 Memcached 示例。我应该用那个吗?谢谢
  • Memcached 可用于存储任何内容(不大于 1 Mb),因为它将其视为数据并且不解释您存储的内容,因此存储 HTML 不是问题。奇怪的是 0 对你不起作用。会不会是空间不足并开始驱逐数据?尝试使用较大的到期值(几天),并使用“stats”命令检查统计信息,以查看是否有任何项目已被驱逐。
猜你喜欢
  • 2011-10-30
  • 2015-02-27
  • 2018-06-26
  • 2011-08-13
  • 2011-08-17
  • 2011-02-02
  • 2021-10-10
  • 2014-04-21
  • 2010-12-30
相关资源
最近更新 更多