php - 如何保持memcache与mysql同步?

标签 php mysql caching memcached

我想使用 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 的数据时,删除该项目以进行缓存。这样您的应用程序将从数据库重新加载条目。

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

缓存解决方案,如 NCacheTayzgrid提供数据库依赖的功能。可以根据数据库上的查询来设置缓存中的项目。缓存监视数据库的更改,如果更新了相应的结果,则使缓存中的数据无效。然而,memcache 不提供此类功能。

关于php - 如何保持memcache与mysql同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942498/

相关文章:

php - 全文Sql查询

ios - 当我尝试为 CIContext 设置选项时,类型 'String' 没有成员 'cacheIntermediates' 错误

android - picasso 的磁盘缓存是如何工作的?

ruby-on-rails - 如何让 Apache 在 Rails 开发中提供新的 css 文件

php - PHP 中的网页图像是否可以 'snag' ?

php - 使用 PHP MySQL 显示特定 child ID 的 parent

mysql - 如何限制查询中的 `like` 运算符以某物开头

java.sql.SQLException : Invalid argument value: java. io.NotSerializableException 异常

php - 如何在 angular.js 中组织 sql 查询返回的列表

php - 在 PHP 中从数组中删除一个元素