如何保持内存缓存与MySQL同步


how to keep the memcache in sync with mysql?

我想使用PHP和MySQL组合实现网页,它有一个部分用于自动更新来自DB的通知计数,首先我选择具有设置时间间隔的ajax来更新通知计数,但是当我去性能时,一些建议说Ajax在很多用户走上正轨时并不理想。 所以我指的是内存缓存机制, 以我的方式,它看起来不错,因为它避免了许多请求连续命中 MySQL,所以现在 Questoins 是如何保持 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 的结果,但这不是更新的数据。 请指导我保持内存缓存与MySQL同步。

谢谢

当数据库中的相应数据更新时,您需要使缓存中的数据失效。一种方法可能是使用唯一 id 作为键而不是整个查询,每当更新该 id 的数据时,请删除该项以进行缓存。这样,应用程序将从数据库重新加载条目。

但是,如果您有范围查询,则很难使缓存中的数据失效。因为您永远不知道更新是否会影响缓存查询的结果。

像NCache和Tayzgrid这样的缓存解决方案提供了数据库依赖性的功能。缓存中的项可以根据对数据库的查询进行设置。缓存监视数据库的更改,并在更新相应的结果时使缓存中的数据失效。但是,这些功能不适用于memcache。