首页 > 代码库 > Memcached笔记
Memcached笔记
u Memcached的基本概念
是一种缓存技术(内存), 你可以把它想象成一张巨大的内存表:形式[他就是一个服务]
key val
key值(字符串) 可以放(字符串【二进制数据[视频、音频、图片]】,数值,数组,对象,)
u 安装memcache服务
步骤
1. 下载
2. 安装
卸载 memcached.exe –d uninstall (-d daemon 后台程序)
停止服务 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 一种缓存技术.