昨天和守住看了下http://hi.baidu.com/156544632/blog/item/3b26527b68623ff00bd18746.html这篇文章,思路很好,但感觉就是太乱了,
而且还出现了一点错误,可能这位仁兄时间比较紧吧,所以考略不是很全面,今天我在这里重新整理了一下,并且做了相应的试验,拿出来
供大家一起学习下。

/*
index.php   程序入口,用来构造sql(如查询,更新)
config.php  配置参数(memcache,mysql)
init.php    封装memcached操作(memcache连接,设置,获取)
mysqli.php  封闭mysql操作(mysql主连接,mysql从连接,mysql主更新,mysql从查询)
*/

index.php
<?php
require 'init.php';              //加载init.php
$mem = new Memcached;            //建立memcached对象,对象为$mem
/*
$mem->set('en_xx','bucuo',0,30); //测试连接memcached,用来调试很不错。
echo($mem->get('en_xx'));
$mem->set('cn_jjyy','wokao',0,30);
echo($mem->get('cn_jjyy'));
*/

require 'mysqli.php';
$sq = new Mysql;    
//下面这两个sql是人为构造的,这也可以做成一个接口                
$sql = "Select * from traffic";                   
//$sql = "insert into traffic(id,acct_mth,amount) values(14,14,46)";
//进行判断,如果sql语句中有头有select(不区分大小写)
if(preg_match ("/^select/i", $sql)){
    $mdsql = md5($sql);
    if(!$result=$mem->get('cn_'.$mdsql)){      //这里选择的是cn memcached,大家也可以根据需求在前面做个条件来将数据存取放入到另一个memcached中。
           $result = $sq->fetArray($sql); //查询是 从mysql
           foreach($result as $var){
                echo $var['amount'];
            }
           $mem->set('cn_'.$mdsql,$result,0,600); //添加到 名为cn的memcached 服务器
    }else{
            foreach($result as $var){
                echo $var['amount']."<br>";
          }
    }
}else{
    $sq->mquery($sql);     //更新是 主mysql
}

?>

config.php
<?php
$memcached = array( 
     'cn'=>array('192.168.x.y',11211),
     'en'=>array('192.168.y.x',11211)
     );
$mysql    = array( 
     'master'=>array('x','root','','test'),
     'slave_1'=>array('y','root','','test'), 
     'slave_2'=>array('z','root','','test') //可以灵活添加多台从服务器
     );
?>

init.php
<?php
class Memcached
{
private $mem;
public $pflag=''; // memcached pconnect tag
    private function memConnect($serkey){     //建立memcached连接,这些都很容易理解
                require 'config.php';
                $server = $memcached;  //$memcached是cn,en的数组
                $this->mem = new Memcache;  
                $link = !$this->pflag ? 'connect' : 'pconnect' ;
                $this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie('memcached connect error');
      }

public function set($ser_key,$values,$flag='',$expire=''){  //设置获取数据
               $this->memConnect($this->tag($ser_key));
                if($this->mem->set($ser_key,$values,$flag,$expire)) return true;
                else return false;
      }

public function get($ser_key){
               $this->memConnect($this->tag($ser_key));
               if($var=$this->mem->get($ser_key)) return $var;
               else return false;
      }
    private function tag($ser_key){
               $tag=explode('_',$ser_key);
               return $tag[0];
      }
    private function errordie($errmsg){
                die($errmsg);
      }
/*  这段函数是我用来在类中做调试用的。
    public function show($messages){
               echo $messages;
    }
*/
}
?>

mysqli.php
<?php
class Mysql
{
/* 这段函数是我用来调试的
public function show($messages){
               var_dump($messages);
    }
*/
private   $mysqlmaster;
private   $myssqlslave;

public function __construct(){   //构造函数
         require 'config.php';
         $msg = $mysql;          //$mysql是master,slave_1,slave_2
         $this->mysqlmaster = new mysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql
         $this->mysqlslave = $this->autotranscat($msg); // slave mysql

if(mysqli_connect_errno()){
                     printf("Connect failed: %s\n",mysqli_connect_error());
                      exit();
          }
        if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){
                    exit("set charset error");
          }
}
private function autotranscat($mysql){        //这段函数的作用是获取从服务器序列号,如1,2
        session_start();                      //启动会话
       $_SESSION['SID']!=0 || $_SESSION['SID']=0;  //如果不为0,就不做赋值操作(那第一次访问的话,肯定会做赋值操作的)
        if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1;  //上面那个动作是为这个动作准备的
        else $_SESSION['SID']++;
        $key = 'slave_'.$_SESSION['SID'];
        return new mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);
}

public function mquery($sql){ //mysql主 insert update
if(!$this->mysqlmaster->query($sql)){
   return false;
}
}

public function squery($sql){   //mysql从 查询
if($result=$this->mysqlslave->query($sql)){
   return $result;
}else{
   return false;
};
}
public function fetArray($sql){  //mysql从 查询 入口
if($result=$this->squery($sql)){
   while($row=$result->fetch_array(MYSQLI_ASSOC)){
    $resultraa[] = $row;
   };
   return $resultraa;
}
}
}
?>

这样就完成了,我画的那幅图了,看懂了吗?

memcached+Mysql(主从)的更多相关文章

  1. php memcached+Mysql(主从)

    /* index.php   程序入口,用来构造sql(如查询,更新) config.php  配置参数(memcache,mysql) init.php    封装memcached操作(memca ...

  2. LVS+Keepalived+Squid+Nginx+MySQL主从高性能集群架构部署方案

    方案一,在tomcat的workers.properties里面配置相关条件 worker.tomcat.lbfactor= worker.tomcat.cachesize= worker.tomca ...

  3. Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  4. mysql主从数据库

    Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...

  5. mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

    转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...

  6. 黄聪:Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  7. mysql主从配置,读写分离

    Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...

  8. 配置mysql主从数据库

    来源地址:https://www.cnblogs.com/alvin_xp/p/4162249.html Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡 ...

  9. Mysql主从分离介绍及实现

    参考: http://www.cnblogs.com/panxuejun/p/5887118.html https://www.cnblogs.com/alvin_xp/p/4162249.html ...

随机推荐

  1. react的传值类型PropTypes简单说明

    1.首先可以有那么多种类型 propTypes: { // 可以声明 prop 为指定的 JS 基本类型.默认 // 情况下,这些 prop 都是可传可不传的. optionalArray: Reac ...

  2. VS2010 VC++ 项目添加引用 出现 Internal CPS Error问题原因及解决办法

    在VS2010 VC++ 项目添加引用时,有时会出现Internal CPS Error错误,提示信息: 'Internal CPS Error: We couldn't find the exist ...

  3. Python学习(四)数据结构(概要)

    Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types          int float Text Sequence ...

  4. JOIN与EXISTS(子查询)的效率研究

    使用MySQL提供的Sample数据库Sakila 现将profiling打开,用来一会查看sql执行时间 set profiling=1; exists 子查询与 join联接效率的对比,功能:查看 ...

  5. Host 'localhost' has multiple addresses. 解决办法

    phpstorm调试php 错误提示: Host 'localhost' has multiple addresses. You must choose one explicitly!Couldn't ...

  6. 用IIS防止mdb数据库被下载

    如何防止mdb数据库被下载?本文讨论的是在服务器端禁止mdb格式数据库文件被下载,而不是在数据库中加入防下载表,将数据库名改为含#号的asp.asa等后缀格式. 下面以IIS6.0为例说明如何在服务器 ...

  7. unexpected token: * 和 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 解决办法

    一.unexpected token: *  的解决办法 首先要搞清楚sql与hql的区别! sql操作的是数据库表,而hql操作的是对象! sql中“select * from table”,而hq ...

  8. [Python爬虫] 之七:selenium webdriver定位不到元素的五种原因及解决办法(转载)

    转载:http://www.51testing.com/html/87/300987-831171.html 1.动态id定位不到元素for example:        //WebElement ...

  9. 【Python】Python Mako模板使用

    参考资料: Mako Templates for Python官网:http://www.makotemplates.org/ Python模板库Mako的用法:http://my.oschina.n ...

  10. 浅析GitLab Flow的十一个规则

    使用 Git 版本控制,是对使用它之前的所有版本控制方式的一种改进.然而,很多组织最终以太过混乱或过于复杂的流程来结束.这个问题对于刚从其他版本控制系统转过来的组织来说特别突出. 在本文中我们会列出 ...