我想使用 PHP 和 MySQL 组合来实现网页,它有一个自动更新数据库通知计数的部分,首先我选择具有设定时间间隔的 ajax 来更新通知计数,但是当我要一些建议称,当许多用户步入正轨时,ajax 的性能并不理想。所以我指的是memcache机制,以我的方式它看起来不错,因为它避免了许多请求连续命中mysql,所以现在的问题是如何保持memcache与mysql同步,我尝试了使用memcache的简单示例,在mysq php代码下面
<?php
$meminstance = new Memcache();
$meminstance->pconnect('localhost', 11211);
mysql_connect("localhost", "appuser", "Appuser") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());
$query = "select id,client,ip,count,title from mysql_common.alert_count";
$querykey = "KEY" . md5($query);
$result = $meminstance->get($querykey);
if (!$result) {
$query = mysql_query("select id,client,ip,count,title from mysql_common.alert_count");
while($row= mysql_fetch_array($query))
{
$id[]=$row['id'];
$count[]=$row['count'];
$title[]=$row['title'];
$client[]=$row['client'];
$ip[]=$row['ip'];
}
$arr['id']=$id;
$arr['count']=$count;
$arr['title']=$title;
$arr['client']=$client;
$arr['ip']=$ip;
$result= json_encode($arr);
$meminstance->set($querykey, $result, false, 20);
echo $result;
print "got result from mysql\n";
return 0;
}
print_r($meminstance->get($querykey));
print "got result from memcached\n";
return 0;
?>
上述代码的工作流程 - 首先是具有此查询数据的memcache,然后从memcache获取,否则从mysql获取结果并存储到memcache,但是当我更新mysql表数据并执行相同的代码时,它给出的结果是memcache 但这不是更新的数据。请指导我保持memcache与mysql同步。谢谢
最佳答案
当数据库中的相应数据更新时,您需要使缓存中的数据失效。一种方法可能是使用唯一的 id 作为键而不是整个查询,并且每当更新该 id 的数据时,删除该项目以进行缓存。这样您的应用程序将从数据库重新加载条目。
但是,如果您有范围查询,则很难使缓存中的数据无效。因为您永远不会知道更新是否会影响缓存查询的结果。
缓存解决方案,如 NCache和 Tayzgrid提供数据库依赖的功能。可以根据数据库上的查询来设置缓存中的项目。缓存监视数据库的更改,如果更新了相应的结果,则使缓存中的数据无效。然而,memcache 不提供此类功能。
关于php - 如何保持memcache与mysql同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942498/