memchache

Memcached 是国外 社区 网站 LiveJournal  的开发团队开发的 高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。把经常使用到数据,放到内存缓存里。

缓存穿透,就是缓存设置,没有实际使用到。

缓存雪崩,通过memcache里的没有的数据,进行查询,mysql里实际中也没有这条数据,造成的结果,就是不断的查询memcache没有,再去查mysql也没有。

<?php
//使用php的memcache拓展
//安装了拓展之后,就拥有了一个类
//实列化类
$mem = new Memcache;
//连接memcache
// $mem->connect('ip',port);
// 服务使用是由ip和端口进行连接的
// memcache默认端口号
$mem->connect('127.0.0.1',11211);
//写入数据
//memcache存储是key=>value
//set(key,value,是否压缩,是否过期 单位s)
$rs=$mem->set('name','php',0,0);
$info=$mem->get('name');
//serialize() unserialize();  非标量数据使用序列化和返序列化

$mem->add('name','gm',0,0);
$mem->replace('name','666');

$mem->set('key',0);
$mem->decrement('key',1);
$mem->increment('key',3);
$mem->delete('key');
$data=$mem->get('key');

$mem->delete('name');
$mem->flush();

session共享机制

默认session是存放在网站的目录里,生成的一个文件。存放要放在session里面的信息。所以需要把信息存储到其他地方(memcache)。

<?php
//设置session存放方式和存储路径  不修改php.ini
ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://127.0.0.1:11211');
//使用session需要开启
session_start(); //session的写入 $_SESSION['name'] = 'php52'; //获取session $name = $_SESSION['name']; echo session_id(); echo '<br />'; var_dump($name);
<?php
//设置session存放方式和存储路径
ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://127.0.0.1:11211');
//使用session需要开启
session_start();
//只读取session
var_dump($_SESSION['name']);
<?php
//使用php的memcache拓展
//安装了拓展之后,就拥有了一个类
//实列化类
$mem = new Memcache;
//连接memcache
// $mem->connect('ip',port);
// 服务使用是由ip和端口进行连接的
// memcache默认端口号
$rs = $mem->connect('127.0.0.1',11211);
//读取session结果
$data = $mem->get('fatmk44i2vkiqrs375j0vjjd33');
var_dump($data);

分布式memcache的运行

在使用memcache中,一个memcache可能是不够用,在并发和数据存储上,可以使用多个memcache进行同时使用操作。运行多个memcache进行使用的操作,叫做分布式memcache的使用。

memcached.exe  -l 127.0.0.1 -p 11212

memcached.exe  -l 127.0.0.1 -p 11213

memcached.exe  -l 127.0.0.1 -p 11214

<?php
//多个memcache使用,分布式memcache
$mem = new Memcache;
//向memcache连接池添加一个memcache服务器
$mem->addServer('127.0.0.1', 11212);
$mem->addServer('127.0.0.1', 11213);
$mem->addServer('127.0.0.1', 11214);
//写操作
$rs1 = $mem->set('name','tom',0,0);
$rs2 = $mem->set('age',18,0,0);
$rs3 = $mem->set('job','php',0,0);
$rs4 = $mem->set('sex',1,0,0);
//输出写的结果
var_dump($rs1);
echo '<br />';
var_dump($rs2);
echo '<br />';
var_dump($rs3);
echo '<br />';
var_dump($rs4);
echo '<br />';
//读操作
$data1 = $mem->get('name');
$data2 = $mem->get('age');
$data3 = $mem->get('job');
$data4 = $mem->get('sex');
//输出写的结果
var_dump($data1);
echo '<br />';
var_dump($data2);
echo '<br />';
var_dump($data3);
echo '<br />';
var_dump($data4);
echo '<br />';

 

memcache可以缓存mysql的数据库的数据,然后可以php直接访问内存缓存memcache,相比访问数据库,会更加快速,并发提高。

<?php
//读取数据默认读取memcache
$mem = new Memcache;
$mem->connect('127.0.0.1',11211);
$memData = $mem->get('data');
//每次获取memcache数据
//如果不存储就到数据库查询,并缓存到memcache
if(empty($memData)){
  //使用mysqli拓展进行连接,要确保php的mysqli是开启的。
  // $mysqli = new mysqli(ip,用户名,用户密码,连接的数据库)
  $mysqli = new mysqli('127.0.0.1','root','root','php_test');
  //sql语句
  $sql = 'select * from student1';
  //执行sql语句
  $rs = $mysqli->query($sql);
  // var_dump($rs);
  //取出数据
  $data = array();
  while ($row = $rs->fetch_row()) {
    $data[] = $row;
  }
  //数据从mysql取出之后,需要缓存到memcache里
  //设置过期时间,进行测试操作
  $mem->set('data',$data,0,10);
  echo 'this is mysql data';
  echo '<br />';
  var_dump($data);
}else{
  echo 'this is memcache data';
  echo '<br />';
  var_dump($memData);
}

 

posted @ 2019-03-11 20:46  za_szybko  阅读(433)  评论(0编辑  收藏  举报