memcached+Mysql(主从)
昨天和守住看了下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(主从)的更多相关文章
- php memcached+Mysql(主从)
/* index.php 程序入口,用来构造sql(如查询,更新) config.php 配置参数(memcache,mysql) init.php 封装memcached操作(memca ...
- LVS+Keepalived+Squid+Nginx+MySQL主从高性能集群架构部署方案
方案一,在tomcat的workers.properties里面配置相关条件 worker.tomcat.lbfactor= worker.tomcat.cachesize= worker.tomca ...
- Mysql主从配置,实现读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- mysql主从数据库
Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...
- 黄聪:Mysql主从配置,实现读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- mysql主从配置,读写分离
Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...
- 配置mysql主从数据库
来源地址:https://www.cnblogs.com/alvin_xp/p/4162249.html Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡 ...
- Mysql主从分离介绍及实现
参考: http://www.cnblogs.com/panxuejun/p/5887118.html https://www.cnblogs.com/alvin_xp/p/4162249.html ...
随机推荐
- Mac配置PHP开发环境
安装环境如下: Mac OS 10.10.1 Apache 2.4.9 PHP 5.5.14 MySQL 5.6.22 Apache配置 在Mac OS 10.10.1中是自带Apache软件的,我们 ...
- POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写
再读本篇文章之前,请先看我的前一篇文章,前一篇文章中有重点讲到POI设置EXCEL单元格格式为文本格式,剩下的设置小数.百分比.货币.日期.科学计数法和中文大写这些将在下面一一写出 以下将要介绍的每一 ...
- OpenCV使用FLANN进行特征点匹配
使用FLANN进行特征点匹配 目标 在本教程中我们将涉及以下内容: 使用 FlannBasedMatcher 接口以及函数 FLANN 实现快速高效匹配( 快速最近邻逼近搜索函数库(Fast Appr ...
- Epplus 设置excel 页边距 及多文件合并
1:使用epplus合并多个excel文件到同一excel的不同sheet页中 private static bool MergeExcel(string _stFilePath, List<s ...
- [Todo] Nodejs学习及Spider实验(包括php入门学习、React入门学习)
/Users/baidu/Documents/Data/Interview/Web-Server开发 深入浅出Node.js-f46c http://blog.csdn.net/u012273376/ ...
- hadoop中典型Writable类详解
本文地址:http://www.cnblogs.com/archimedes/p/hadoop-writable.html,转载请注明源地址. Hadoop将很多Writable类归入org.apac ...
- 如何在Django1.6结合Python3.4版本中使用MySql
唉,最近赶了个新潮,用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql. 悲催的是在Python2.7时代连接MySql的MySQLdb还不支持Python3.4,还 ...
- (转)一个非常好的akka教程
akka系列文章目录 akka学习教程(十四) akka分布式实战 akka学习教程(十三) akka分布式 akka学习教程(十二) Spring与Akka的集成 akka学习教程(十一) akka ...
- [Angular] Angular Elements Intro
Make sure install the latest Angular v6 with Angular CLI. Checkout ght Github for the code. 1. Creat ...
- Activiti 流程启动及节点流转源代码分析
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文主要是以activiti-study中的xiaomage.xml流程图为例进行跟踪分析 详细的 ...