php - Memcached奇怪的问题!

标签 php mysql memcached

我有一个 DAU 为 25 万的 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 服务器。这是最好的解决方案吗?

感谢您的回答。

达科

最佳答案

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

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

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

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

关于php - Memcached奇怪的问题!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4398969/

相关文章:

php - 使用变量从mysql获取数据

php - Codeigniter 2 的自定义表单验证错误消息

php - 使用 PHP 为每个 mysql 表行生成单独的 XML 文件

php - MYSQL - 根据列是否为空将值追加或插入到列中

php - Memcached不保存生成的数据

memory - 如何找到内存访问次数

java - 内存缓存和性能

php - 如何修复 WooCommerce 中的 "Uncaught Error: Call to a member function get_tax_class() on null"?

php - 组织 MySQL 客户/数据表

sql - 如何在 MySQL 中生成数据库 DB 脚本(MySQL 查询浏览器/Toad for MySQL)