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 '
'; 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 '
'; var_dump($rs2); echo '
'; var_dump($rs3); echo '
'; var_dump($rs4); echo '
';
//读操作 $data1 = $mem->get('name'); $data2 = $mem->get('age'); $data3 = $mem->get('job'); $data4 = $mem->get('sex'); //输出写的结果 var_dump($data1); echo '
'; var_dump($data2); echo '
'; var_dump($data3); echo '
'; var_dump($data4); echo '
';
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 '
'; var_dump($data); }else{ echo 'this is memcache data'; echo '
'; var_dump($memData); }