memcache学习笔记

原创 2013年12月05日 19:02:10
Memcached技术

介绍:
memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速,
在memachec 中维护了一张大的hashtable表 ,该表是在内存,表的结构是
key    value
字串  (字串,数值,数组,对象,布尔,二进制数据,null)

原理说明:
windows下安装步骤安装并使用memcached
安装步骤
(1)     下载memcached软件
(2)     安装
进入cmd ,切换到 memcached.exe 文件所在目录
memcached.exe –d install
(3)     启动memcached
第一种,可以到服务点击启动
第二种, 命令行
memcached.exe –m 200MB –d start  【以deamon方式启动,默认64M】

如果你在启动时,win7启动不成功, 则可以使用如下方法
memcached.exe –p 端口号

启动方法不要关闭控制台.

端口号的范围 : 0-65535  , 因为端口号是用两个字节来表示
有名端口: 0-1024 已经用程序使用 , apache 80  , mysql 3306 , ftp 21 , ssh 22
oracle: 1521, stmp: 25 

使用netstat –an 如果看到 11211端口在监听,说明启动ok
netstat –anb 是哪个程序监听, 这个指令还可以看到有哪些用户连接到我们的服务器.

如果没有安装好,原因可能
1.     如果你是win7, win7对安全性高,所有,必须以adminstartor 身份来安装.
你切换成adminstrator , 去安装,在启动
2.     你的memcached.exe 目录有中文,或特殊字符, 保证目录没有中文和特殊字符.

(4)     准备研究如果对memcached进行curd操作.

看看telnet如何操作 (curd)

1.     登录到telnet连接到 memcached服务
telnet 127.0.0.1  11211

如果你们不能使用telnet 是因为系统不存在 telnet.exe , 就可以到其它机器上拷贝 telnet.exe 放在 c:\windows\system32 即可
2.     增加
基本语法是:
add key名 0 存放时间(秒) 数据大小(字符)
举例:
add key1 0 30 5

3.     如何获取
基本语法是:
get key值
get key1
4.     修改

set key名 0 存放时间 数据大小.

举例:
set key1 0 40 5
☞ 如果key1不存在,则相当于增加新,如果存在,则相当有替换

replace key名 存放时间 数据大小
replace key1 0 40 5
☞ 如果key1不存在,则失败,这个指令要求key必须存在.

5.     删除
基本语法是
delete key名
比如
delete key1

append     Append data to existing key     append key 0 60 15
prepend     Prepend data to existing key     prepend key 0 60 15


flush_all 可以统一把数据清空.


这里主要大家可以去计算出命中率 cmd_hits/cmd_get . 越高越好.



 如何使用php程序操作memcached服务 curd.

步骤,准备工作.
(1)     把 php_memcache.dll 文件拷贝 php的ext 下
☞ 不同版本的php 所使用的 php_memcache.dll 的版本不一样
(2)     修改php.ini文件,加载 php_memcache.dll (该文件就是封装了一堆函数)
;加载php_memcache.dll 文件
extension=php_memcache.dll
(3)     重新启动apache
(4)     我们写程序来完成curd操作.

细节: 在我们添加数据的时候,如果 
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
如果报 expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在mem中)
exprie 直接给的是秒数,则最大 30*3600*24
如果你希望保持时间超过30  time()+天数*3600*24 即可

最后代码:
mem1.php 
<?php
	class Dog{
		public $name;
		public $age;
		
		public function __construct($name,$age){
			$this->name=$name;
			$this->age=$age;
			
			}
		
		}


	
	$mem=new Memcache;
	
	if(!$mem->connect("127.0.0.1",11211)){
		die("连接失败");


	}
	//增加a
	
	
	//1.增加一个字符串
	if($mem->add("key1","abc",MEMCACHE_COMPRESSED,60)){
	echo "ok";

	}
	//2.增加一个数字
	
	if($mem->add("key2",100,MEMCACHE_COMPRESSED,60)){
	echo "ok";

	}
	//3.增加一个数组
	//根据需要
	$arr=array("a"=>"字符串","b"=>"插入");
	if($mem->add("key3",$arr,MEMCACHE_COMPRESSED,60)){
	echo "ok";

	}
	//4.增加一个对象
	$dog1=new Dog("小狗",50);
	
	if($mem->add("key4",$dog1,MEMCACHE_COMPRESSED,60)){
	echo "ok";

	}
	
  //5.添加null 布尔值(bool类型的多种 没有元素的数组)
	if($mem->add("key5",null,MEMCACHE_COMPRESSED,60)){
	echo "ok";

	}
	//6.资源类型 目前还不支持mysql资源
	$con=mysql_connect("127.0.0.1","root","");
	if(!$con){
		die("连接不成功");
		}
	var_dump($con);
	if($mem->add("key6",$con,MEMCACHE_COMPRESSED,60)){
	echo "ok";

	}
	
	//7.序列化
	
	$arr2=array("a"=>"字符串","b"=>"插入");
	if($mem->add("key7",serialize($arr2),MEMCACHE_COMPRESSED,60)){
	echo "ok";

	}
	
	//查询
	$val=$mem->get("key7");
	var_dump($val);

	//修改
	if($mem->replace("key11","hello",MEMCACHE_COMPRESSED,60)){
		echo "replace ok";
		
	}else{
		echo "replace no ok";
		}
		
		//删除
		if($mem->delete("key14")){
			
			echo "delete ok";
		}else{
			echo "not exsists";
		}
		
		//清空所有
		
	



mem2.php
<?php

	class Dog{
		public $name;
		public $age;
		
		public function __construct($name,$age){
			$this->name=$name;
			$this->age=$age;
			
			}
		
		}


	
	$mem=new Memcache;
	
	if(!$mem->connect("127.0.0.1",11211)){
		die("连接失败");


	}

	//查询
	$val=$mem->get("key4");
	var_dump($val);


test.php 说明serilize 和 json_encode用法:
//什么时候使用serilize 什么时候使用json_encode [ajax配合]

  如何使用PHP源码来操作memcached服务
如果管理员不让我们去加载 memcache.dll 文件,我们可以直接通过源码操作.

关闭扩展.

代码mem3.php

<?php 

require_once 'memcached-client.php';
 $mc = new memcached(array(
             'servers' => array('127.0.0.1:11211'),
             'debug'   => false,
             'compress_threshold' => 10240,//最大压缩率
               'persistant' => true));//是否持久连接

 $mc->add('key', array('some', 'array'));
 $mc->replace('key', 'some random string');
 $val = $mc->get('key');
 echo $val;
 //修改
 $mc->set('key',"bj");
 $val = $mc->get('key'); 
 echo $val;
 //删除
 $mc->delete("key"); 
 $val = $mc->get('key'); 
 echo $val;




Memcached 机制的深入了解


1、cs架构
2、基于libevent事件处理
3、memcache的数据是放入到内存,并且在数据爆满的情况下,使用LRU 算法删除


写段代码说明: mem4.php

<?php
	$mem=new Memcache;
	//电脑上有两个memcached服务;
	$mem->addServer("127.0.0.1",11211);
	$mem->addServer("127.0.0.1",9999);
	
	//放入哪个服务器,不知道,由$mem对象本身维护。
	if($mem->set('key1',"hello",MEMCACHE_COMPRESSED,500)){
		echo "add ok";
		
		}
		
		if($mem->set('key2',"hello2",MEMCACHE_COMPRESSED,500)){
		echo "add ok";
		
		}
		
		if($mem->set('key3',"hello3",MEMCACHE_COMPRESSED,500)){
		echo "add ok";
		
		}
	
	
	



mem5.php 取出.
     
<?php
	$mem=new Memcache;
	//电脑上有两个memcached服务;
	$mem->addServer("127.0.0.1",11211);
	$mem->addServer("127.0.0.1",9999);
	
	$val=$mem->get("key1");
	
	echo '程序中取出分布的值='.$val;





总结:
1.     mem服务的数据不是同步, 数据是分布的
2.     把什么数据放入到哪个memcached是由客户端的mem对象决定
3.     当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销

 memcache的细节讨论
①     生命周期
从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.
memcache的数据被销毁的情况如下:
1.     时间到
2.     重启memcached服务
3.     重启memcached服务所在的机器
4.     delete / flush 销毁数据
②     如何把session数据放入到memcached服务中.
步骤:
1.     修改php.ini的配置文件
如下:
;[sesson.save_handler 有user|files|memcache]
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
③     测试一把,重启apache
测试ok 

<?php

	ini_set("session.save_handler","memcache");
	ini_set("session.save_path","tcp://127.0.0.1:11211");
	session_start();
	
	$_SESSION['name']='天龙八部4000';
	$_SESSION['city']='beijing';
	class Dog{
		public $name;
		
	}
	$dog1=new Dog;
	$dog1->name="abcde";
	$_SESSION['dog']=$dog1;
	//如果session的数据入mem,那么一定是以session_id为key值添加的。
	$name=$_SESSION['name'];
	echo "name=$name";
	echo "session_id=".session_id();
	



思考,如果管理员,不让我们修改 php.ini 文件,我们如何处理session入memcached这个功能, 我们通过一个函数可以去修改 php.ini 的配置.

代码:
<?php

     ini_set("session.save_handler","memcache");
     ini_set("session.save_path","tcp://127.0.0.1:9999");

同时你也可以通过 ini_set 去动态的修改对php.ini 的其它设置 。但是他不影响其它php页面,也不会去修改php.ini 文件本身, 只对本页面生效.

memcached vs session比较
memcached 主要的目的是提速 ,因此它是一种无状态的数据.即,数据不和用户绑定.
session数据是和绑定的,因此是一种有状态数据.

memached安全性
如何使用memcached 服务才是安全的.

在windows下通过启用防火墙来保护我们的memcached
在linux 也可以使用防火墙.
setup 配置防火墙
iptables -a input -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT
什么样的数据适合放入memcached中?

和memcached技术类似是redis (key/value数据库)















memcache 学习笔记

在网上找了一份比较好的日本人写的memcache教程,花一下午的时间熟悉了一下,记录一下,以后也许会有用。 memcached 是指高性能的分布式缓存服务器,通过缓存数据,减少数据库的访问字...
  • ymyss4
  • ymyss4
  • 2013年07月19日 18:08
  • 395

MemCache学习笔记

简介 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将...
  • dhmj2ee
  • dhmj2ee
  • 2012年11月05日 10:26
  • 2606

Memcache学习笔记

1.安装memcache 下载地址:http://memcached.org/downloads 安装时提示没有libevent则还需安装libevent 下载地址:http://libeven...
  • fb408487792
  • fb408487792
  • 2015年02月11日 16:36
  • 219

memcache的简单介绍和使用

memcache简单入门
  • bulelemon
  • bulelemon
  • 2015年12月12日 23:10
  • 3630

踩坑系列之 memcache的有效期

前言今天写了一个很简单的限制频率的问题。采用了mc来缓存东西,由于需要缓存一个月,我选择了,设置时间为86400*31.试了半天发现一直设置不成功。于是有了此文纪念我那懵逼的半个多小时。正文memca...
  • u011957758
  • u011957758
  • 2016年10月13日 23:48
  • 2046

memcache监控常用方法

memcache监控常用方法 1、采用图形化方式: 参考:http://jingyan.baidu.com/article/6525d4b11f482bac7d2e94da.html 在http://...
  • hsbirenjie
  • hsbirenjie
  • 2014年11月25日 19:39
  • 1424

Memcache - 一款图形化memcache监控工具

对于memcache监控,一般可以利用memcache自带的STAT命令来查看,但是其输出的结果对于开发而言不是很明了,监控的目的是让开发通过监控的结果去调优程序。这里介绍一款形化memcache监控...
  • eaglecolin
  • eaglecolin
  • 2016年12月23日 19:34
  • 1688

memcache真实项目缓存实例

memcache,缓存,优化,公司真实项目
  • judyfun
  • judyfun
  • 2015年06月10日 15:57
  • 3376

memcache在linux上配置服务日志

转载http://chenzhou123520.iteye.com/blog/1925209 memcache在linux上安装时并不支持显示地配置服务日志,我们如果想要把memcach...
  • yangjiehuan
  • yangjiehuan
  • 2014年08月05日 17:44
  • 3482

memcache查看数据命令

http://www.ttlsa.com/memcache/memcache-list-all-keys/
  • zhengyong15984285623
  • zhengyong15984285623
  • 2015年11月25日 17:46
  • 2617
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:memcache学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)