如何让memcache与mysql保持同步?

时间:2014-11-15 04:20:00

标签: php mysql caching memcached

我想使用PHP& amp;来实现网页MySQL组合,它有一个部分用于自动更新来自DB的通知计数,首先我选择具有设置时间间隔的ajax来更新通知计数但是当我去表演时一些建议说ajax并不理想当许多用户在轨道上。所以我指的是memcache机制,以我的方式它看起来很好,因为它避免了许多请求不断地打击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获取,则从mysql获取结果并存储到内存缓存,但是当我更新mysql表数据并执行相同代码时,它会给出结果memcache,但那不是更新数据。请指导我让memcache与mysql保持同步。感谢

1 个答案:

答案 0 :(得分:0)

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

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

NCacheTayzgrid等缓存解决方案提供了数据库依赖性的功能。可以根据数据库上的查询设置缓存中的项目。如果更新了相应的结果,则缓存监视数据库的更改并使缓存中的数据无效。但是,memcache无法使用这些功能。