u Memcached的基本概念
php
是一种缓存技术(内存), 你能够把它想象成一张巨大的内存表:形式[他就是一个服务]mysql
key val linux
key值(字符串) 能够放(字符串【二进制数据[视频、音频、图片]】,数值,数组,对象,)算法
u 安装memcache服务sql
步骤数据库
1. 下载apache
2. 安装json
卸载 memcached.exe –d uninstall (-d daemon 后台程序)windows
中止服务 memcahced.exe –d stop 数组
安装 memcached –d install
3. 测试是否安装成功
启动
memcached –d start
咱们使用
netstat –an 看看是否有 11211 端口在监听,若是在监听,则说明成.
netstat –anb (b 能够显示 是哪一个程序在监听这个端口.)
若是如今,我要杀掉这个程序 ,在windows 下 可使用任务管理器杀死.
linux kill -9 进程号 killall 进程名
大部分同窗安装Ok, 只有是xp都ok,
win7 的同窗有一部分没有ok
a. 把 memcached.exe 放在 中文目录 , 这样不行
b. 安装使用的是 普通用户, 你要切换成 administror ctrl+alt+delete
如何操做memcached 服务.
学习如何完成crud操做! (任务驱动 | )
telnet 的具体使用
a. 登陆到telnet
语法
telnet ip 端口
登陆到 11211 端口
telnet 127.0.0.1 11211
b 如何对mem进行 curd 操做
添加
add key1 0 60 5
说明 key1 表示 键值 ,能够本身指定
0 表示一个格式, 不变
60 存放在mem多长时间
5 表示存放的数据是多少个字节
查询
get 键值
举例
get hsp1
说明若是 hsp1 不存在,或是是由于时间到而被 memcache 删除了,将获得空.
修改
有两种方法
replace 键值 0 时间 大小 【这里有一个注意事项,该键值必须存在】
举例:
replace hsp1 0 40 8
第二种方法:
set 键值 0 时间 大小 【若是这个键存在,则替换,若是不存在,则表示添加一个新的键值】
案例
set hsp1 0 60 5
删除
语法
delete 键值
如今,若是咱们在mem服务中,须要作一个计数器(存放值必定是一个数),怎么办?
key val
counter 0
add counter 0 0 100
incr key 数字
telnet使用ok!
u 如何使用memcache 的扩展来操做memcached 服务
(1) 把 php_memcache.dll 拷贝 ~php/ext/目录
(2) 在 php.ini 中添加一句话
;引入php_memcache.dll
extension=php_memcache.dll
(3) 使用 PHP 程序 curd
<?php
//建立对象
$mem=new Memcache;
//链接到mem服务器
$mem->connect("127.0.0.1",11211);
//添加,该函数返回true
if($mem->add("hsp1","china",MEMCACHE_COMPRESSED,60)){
echo "添加ok";
}else{
echo "添加err";
}
//查询
$val=$mem->get("hsp1");
echo "val=$val";
echo "<br/>";
//修改 replace set
if($mem->replace("hsp1","hello,world",MEMCACHE_COMPRESSED,60)){
echo "replace ok";
}else{
echo "replace 失败";
}
echo "<br/>";
//set 若是存在就替换,不存在,就添加
if($mem->set("hsp1","hello,world , 你好!",MEMCACHE_COMPRESSED,60)){
echo "set ok";
}else{
echo "set 失败";
}
echo "<br/>";
//删除
if($mem->delete("hsp1")){
echo "删除ok";
}
(4) 谈谈细节,增强
讨论, 在memcache中什么数据类型能够放入. 字符串 ,数字 ,数组, 对象 ,资源
当咱们在mem中存取对象是,在取的时候,咱们须要在前面引入这个类的声明.
把这个代码:
<?php
//放入数组
$arr=array("1"=>"beijing","2"=>"天津");
//数组默认是序列号
if($mem->add("city2",json_encode($arr),MEMCACHE_COMPRESSED,60)){
echo "city ok";
}else{
echo "city fail";
}
//对象
class Dog{
public $age;
public $color;
public function __construct($age,$color){
$this->age=$age;
$this->color=$color;
}
}
$dog1=new Dog(30,"红色");
if($mem->add("dog1",$dog1,MEMCACHE_COMPRESSED,60)){
echo "dog1 ok";
}else{
echo "dog1 fail";
}
echo "<br/>";
$mydog=$mem->get("dog1");
echo $mydog->age;
var_dump($mydog);
$con=mysql_connect("localhost","root","root");
echo "<br/>";
if($con){
//放入mem
if($mem->add("conn",$con,MEMCACHE_COMPRESSED,160)){
echo "资源添加ok";
}else{
echo "资源添加失败";
}
}
工做环境: apache 的 httpd.conf 文件 php.ini 文件是有其余人来管理,你没有权利去修改这些配置文件,可是你还但愿去使用memcached
解决方法: 咱们使用原生态的代码来完成.->这里咱们能够直接使用
咱们能够把 memcached-clinet.php 引入到咱们的项目中,而后我就能够直接来完成了.
代码: 完成 crud操做.
① 先关闭 extension
② 咱们写mem4.php 并引入咱们的 memcached-clinet.php 通常说全部的技术文档,都会给你一个案例,因此你照这个案例能够快速使用
<?php
//直接使用函数来操做咱们的memcached
include "memcached-client.php";
$mc = new memcached(
array(
'servers' => array('127.0.0.1:11211'),
'debug' => false,
'compress_threshold' => 10240,
'persistant' => true));
//添加 【这里仍然支持添加 数组,对象,数值 】
if($mc->set('hsp1', "你好!北京!",60)){
echo "ok";
}else{
echo "fail!";
}
//获取
$val=$mc->get("hsp1");
echo "<br/>"."val=$val";
//修改 直接使用set函数,就是 replace
if($mc->replace("hsp1","北京",30)){
echo "<br/>修改为功!";
}else{
echo "<br/>修改fail!";
}
//获取
$val=$mc->get("hsp1");
// echo "<br/>"."修改后 val=$val";
if(is_array($val)){
echo "<pre>";
print_r($val);
echo "</pre>";
}else if(is_float($val)){
echo "<br/>"."修改后 val=$val";
}else if(is_string($val)){
echo "<br/>"."修改后 val=$val";
}
//删除
/* if($mc->delete("hsp1")){
echo "<br/>删除成功!";
}else{
echo "<br/>删除fail!";
}*/
u 关于memcache的机制
1. 是基于 c/s 2. 底层的协议是 普通文本
2. 是基于 libevent机制处理
3. memcache的数据是放在内存
4. memcache自己支持 LRU 算法
[算法/网络/数据库/操做系统+编译原理 pl0[if + -]]
5. 基于客户端分布式.示意图
u memcache细节
1. 生命周期
数据的生命周期是指定的,只有把数据放入就开始计时,只要时间到,就销毁.
session(1440s) 若是你没有关闭浏览器,而且没有使用session 1440后销毁
1439使用一次这个sesion ,又开始从新计时.
2. 如何把session 放入memcache服务器
sesion 垃圾回收的几率是 session.gc_probability/ session.gc_divisor
步骤
(1) 由于session 默认是放在文件中, windows下 c:/windows/Temp
(2) 从新配置php.ini 把关于session配置修
session.save_handler = memcache
; 修改路径
session.save_path = "tcp://127.0.0.1:11211"
(3) 若是咱们不去修改php.ini 也达到这样的效果
可使用 ini_set 函数来玩
代码:
<?php
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://127.0.0.1:11211");
session_start();
$_SESSION['name']="shunping";
echo "<br/>存放sesionok";
echo "<br/>session_id=".session_id();
//取出
$val=$_SESSION['name'];
echo "<br/>session name=".$val;
(4) memcache是无用户状态,也就是说,是全部用户共享的数据
(5) 安全性.
windows. 下咱们使用防火墙 同时 打开 80端口. , 只让咱们本身 php程序去操做咱们的memached服务。这样咱们的memcache就安全,
linux下 iptables -a input -p tcp -s 127.0.0.1 –dport 11211 -j ACCEPT
总结:
--我本身的一个小结如何决定是否使用memcached
--若是是一个小网站,pv(page view)值不大,就不考虑使用memcache了
--变化频繁,查询频繁,可是不必定写入数据库(适合memcache)
--变化频繁, 一变化就要入库[好比股票,金融.](不适合memcache)
u memcache 和 session 对比
1. memcache 放入内存,session默认放入文件,可是经过配置,也能够入memcached
2. 生命周期 (memcahce 数据一旦建立就开始时间,到时就销毁 , session 建立后计时,可是若是在没有成垃圾前,你又使用过一次,则从新计算)
3. 解决的问题不同 memcache为了提高速度 , session 是用于追踪用户的行为
相关技术 Redis 也是 key/value 一种缓存技术.