欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

教程  php进阶(三)--memcache技术应用详解(上)

PHP学习 本站 1050 0评论

一、什么是memcache


memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。 

官网:http://memcached.org/ 

中文网:http://www.memcached.org.cn/

中文手册:http://www.memcached.org.cn/3815.html 

111.jpg

使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。


Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。


Memcached以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。


关于memcache和memcached的区别请参考:https://ittxx.cn/view/286 


MemCache的工作流程如下: 

222.jpg

1、检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作,路径操作为①②③⑦。

2、如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现),路径操作为①②④⑤⑦⑥。

3、每次更新数据库的同时更新memcached中的数据,保证一致性。

4、当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。


Memcached特征:


协议简单: 它是基于文本行的协议,直接通过telnet在memcached服务器上可进行存取数据操作。


基于libevent事件处理:memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。 ibevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,与传统的select相比,提高了性能。


内置的内存管理方式: 所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失。


分布式: 各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。服务器并不具有分布式功能,分布式部署取决于memcache客户端。


在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。


Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 ,

· 最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA 

60*60*24*30控制 

· 最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制 

· 单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制,它是默认的slab大小 

· 最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过 settings.maxconns=1024 进行控制 

· 跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式

  

memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。


memcached已经可以支持C/C++、Perl、PHP、Python、Ruby、Java、C#、Postgres、Chicken Scheme、Lua、MySQL和Protocol等语言客户端。


二、Memcache的安装和配置


1.Linux下安装和配置memcache


· 下载:

到官方下载memcache(http://memcached.org/   ),目前最新的下载版本是1.4.5

还要再安装libevent这个软件,从官方(http://libevent.org/  )下载,目前最新的稳定版是1.4.14。


· 安装:

下载后,将其上传到/home/blue/下面(目录可以更改)

cd /home/blue

tar zxvf memcached-1.4.5.tar.gz

tar zxvf libevent-1.4.14b-stable.tar.gz


#安装libevent

cd libevent-1.4.14b-stable

./configure --prefix=/home/liuzhy/libevent-1.4.14b-stable

make

make install


测试libevent是否安装成功:

# ls -al /home/liuzhy/libevent-1.4.14b-stable /lib | grep libevent


#安装memcache,同时需要安装中指定libevent的安装位置:

cd /home/blue/memcached-1.4.5

./configure --prefix=/home/blue/memcached-1.4.5 --with-libevent=/home/blue/libevent-1.4.14b   //指定libevent的位置

make 

make install 


如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。

安装完成后会把memcached放到 /usr/local/bin/memcached


测试是否成功安装memcached:

# ls -al /usr/local/bin/mem*

-rwxr-xr-x 1 root ??? root ?? 137986 11?? 12 17:39 /usr/local/bin/memcached

-rwxr-xr-x 1 root ??? root ?? 140179 11?? 12 17:39 /usr/local/bin/memcached-debug

恩,安装完成了,现在我们看以下memcache的帮助:

# /usr/local/bin/memecached -h

memcached 1.2.0
-p <num> 是设置Memcache监听的端口,这里设置了12000,最好是1024以上的端口
-s <file> unix socket path to listen on (disables network support)
-l <ip_addr> 连接的IP地址, 默认是本机 是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址192.168.0.122
-d 以守护程序(daemon)方式运行 memcached
-r maximize core file limit
-u 以的身份运行 (仅在以root运行的时候有效)<username> assume identity of <username> (only when run as root)
-m <num>最大内存使用,单位MB。默认64MB max memory to use for items in megabytes, default is 64 MB是分配给Memcache使用的内存数量,单位是MB,这里是10MB
-M内存耗尽时返回错误,而不是删除项return error on memory exhausted (rather than removing items)
-c <num> 选项是最大运行的并发连接数,默认是1024,这里设置了256,按照你服务器的负载量来设定
-k lock down all paged memory
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-h 显示帮助<-->print this help and exit
-i print memcached and libevent license
-b run a managed instanced (mnemonic: buckets)
-P <file> save PID in <file>, only used with -d option是设置保存Memcache的pid文件
-f <factor> 块大小增长因子,默认是1.25chunk size growth factor, default 1.25
-n <bytes> ?? ?最小分配空间,key+value+flags默认是48minimum space allocated for key+value+flags, default 48


· 启动和配置

进入bin目录,执行:./memcached -d -m 1024 -u blue,但是系统说有一个共享库没有加载,共享库的名称为:libevent-1.4.so.2

首先要查看一下memcached 这个命令用到的链接库地址在哪儿。执行如下命令可以查看:

LD_DEBUG=libs /usr/local/memcached/bin/memcached -v

显示出memcache从哪些地方找libevent-1.4.so.2这个文件,所以,我们只有将libevent-1.4.so.2这个文件指定到上面任意一个目录即可。这里我们将其指定到/lib64/下面。做一个软连接即可。命令如下:

ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2

在启动一下memcache服务:./memcached -d -m 1024 -u blue 就可以了。


在64位系统中,会报libevent-1.4.so.2文件无法找到,解决办法是把32位目录里的同名文件链接至64位目录中,即像windows那样建立快捷方式。

Shell > /usr/local/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2

启动后如果发现没有端口在监听,是因为命动命令时带pid参数的“p”是大写“P”,你可能写成小写了。


1)启动Memcache的服务器端:

# /usr/local/bin/memcached -d -m 100 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程,

-m是分配给Memcache使用的内存数量,单位是MB,这里是100MB

-M 内存耗尽时返回错误,而不是删除项,即不用LRU算法 

-u是运行Memcache的用户,我这里是root

-l是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址192.168.0.200

-p是设置Memcache监听的端口,这里设置了12000,最好是1024以上的端口

-c选项是最大运行的并发连接数,默认是1024,这里设置了256,按照你服务器的负载量来设定

-P是设置保存Memcache的pid文件,这里是保存在 /tmp/memcached.pid

-f 块大小增长因子,默认是1.25

-n 最小分配空间,key+value+flags默认是48

-h 显示帮助


获取运行状态:

echo stats | nc 192.168.1.123 11200

watch "echo stats | nc 192.168.1.123 11200" (实时状态)

1、memcached的连接函数(connect, pconnect)

2、memcahced的操作函数(set, get, delete, replace, flush)

3、多服务器配置函数(addServer)

4、状态监控函数(getStats.....)


一开始说的“-d”参数需要进行进一步的解释:

-d install 安装memcached

-d uninstall 卸载memcached

-d start 启动memcached服务

-d restart 重启memcached服务

-d stop 停止memcached服务

-d shutdown 停止memcached服务


2)如果要结束Memcache进程,执行:

# kill 'cat /tmp/memcached.pid'

也可以启动多个守护进程,不过端口不能重复。 


3)重启apacheservice  httpd  restart


· 检查服务:

1、查看启动的memcache服务:

netstat -lp | grep memcached

2、查看memcache的进程号(根据进程号,可以结束memcache服务:“kill -9 进程号”)

ps -ef | grep memcached 


· Memcache环境测试:

运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始领略Memcache的魅力把!

< ?php
$mem = new Memcache;
$mem->connect(”127.0.0.1″, 11211);
$mem->set(’key’, ‘This is a test!’, 0, 60);
$val = $mem->get(’key’);
echo $val;
?>


2.Window下安装和配置memcache


· 下载:去百度下载或(http://www.runoob.com/memcached/window-install-memcached.html  )


· memcached < 1.4.5安装: 

1)将下载的安装包解压后放到电脑固定盘一个目录中,如D:\php\memcached

2)启动命令行, 切换至安装目录 , 输入memcached.exe -d install (如:D:\php\memcached\memcached.exe -d install) 将memcache注册为windows服务

3)然后再启动memcache,输入 memcached.exe -d start (如: D:\php\memcached\memcached.exe -d start),开启memcache服务

使用telnet连接测试是否成功:  telnet 127.0.0.1 11211【win7要开先启telnet客户端】

输入:stats 命令查看基本信息


· memcached >= 1.4.5 版本安装:

1)解压下载的安装包到指定目录。

2)在 memcached1.4.5 版本之后,memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,在 window 启动时设置 memcached自动执行。


我们使用管理员身份执行以下命令将 memcached 添加来任务计划表中:

schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"

注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。

注意:-m 512 意思是设置 memcached 最大的缓存配置为512M。

注意:我们可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。


3)如果需要删除 memcached 的任务计划可以执行以下命令:

schtasks /delete /tn memcached


· 配置

php安装Memcached模块支持:将php_memcache.dll 拷贝到 php安装目录下的ext文件夹下,在php.ini文件最后面加上下面这句extension=php_memcache.dll 记得是最后面。重启apache就ok了!

通过php探针查看如下:

333.jpg


如果我们需要卸载 memcached ,可以使用以下命令:

memcached.exe -d uninstall


· Memcached 连接

我们可以通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。

语法:telnet HOST PORT

命令中的 HOST 和 PORT 为运行 Memcached 服务的 IP 和 端口。


· 测试windows下的Memcached

<?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
$mem->set('key', 'Hello Memcached!', 0, 60);
$val = $mem->get('key');
echo $val;
?>

输出:Hello Memcached!

444.jpg


3.PHP的memcache扩展的安装


1、 windows平台memcache扩展的安装

1)将memcache.exe,libgcc_s_sjili-1.dll,pthreadGC2.dll放到php安装目录

2)看下自己的php是什么版本的,是支持vc9的还是vc6的, 选择正确的版本的php_memcache.dll.* 将后面的vc9或者是vc6去掉, 拷贝到 php安装目录下的ext文件夹

3)启动命令行, 将php安装目录里面的memcache.exe拖到里面, 在后面输入 -d install (如:C\php\memcache.exe -d install) 将memcache注册为windows服务

4)然后再启动memcache,将php安装目录里面的memcache.exe拖到里面,在后面输入 -d start (如:C\php\memcache.exe -d start),开启memcache服务

5)在php.ini文件最后面加上下面这句

extension=php_memcache.dll

记得是最后面

重启apache或者是iis,就ok了!

如果安装错误请查看文章:https://blog.csdn.net/zpf336/article/details/43833179 


2、 linux平台memcache扩展的安装

下载地址:http://pecl.php.net/package/memcache  ,你可以下载最新稳定包(stable)。


wget http://pecl.php.net/get/memcache-2.2.7.tgz               

tar -zxvf memcache-2.2.7.tgz

cd memcache-2.2.7

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config

make && make install

注意:/usr/local/php/ 为php的安装路径,需要根据你安装的实际目录调整。


安装成功后会显示你的memcache.so扩展的位置,比如我的:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

最后我们需要把这个扩展添加到php中,打开你的php.ini文件在最后添加以下内容:

[Memcache]extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"extension = memcache.so

添加完后 重新启动php,我使用的是nginx+php-fpm进程所以命令如下:

kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'

如果是apache的使用以下命令:

/usr/local/apache2/bin/apachectl restart

检查安装结果:

/usr/local/php/bin/php -m | grep memcache

安装成功会输出:memcache。


或者通过浏览器访问 phpinfo() 函数来查看,如下图:

123.jpg


连接测试:

<?php
$memcache = new Memcache;             //创建一个memcache对象
$memcache->connect('localhost', 11211) or die ("Could not connect"); //连接Memcached服务器
$memcache->set('key', 'test');        //设置一个变量到内存中,名称是key 值是test
$get_value = $memcache->get('key');   //从内存中取出key的值
echo $get_value;
?>


笔记:

Centos 下使用 yum 命令快速安装 Memcached 与 php-memcached:

rpm qa|grep memcached //首先检查memcache是否已经安装完成

yum install  memcached //(提示你是否确认安装输入y)检查完成后执行安装命令

yum install  php-memcached //安装php的memcache的扩展

systemctl start httpd //开启apache

systemctl start memcached //开启memcached

setenforce 0

安装完成后可以使用 php 的 phpinfo(); 函数检查 memcache 是否安装。


三、Memcache接口方法介绍


1.Memcache初试


写一个 example.php 文件(更多使用方法可以参看 PHP 手册里的 Memcache Functions 使用说明),测试代码如下:

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)<br/>\n";
$get_result = $memcache->get('key');
echo "Data from the cache:<br/>\n";
var_dump($get_result);
?>

如果输出如下,则测试成功:

Server's version: 1.4.5

Store data in the cache (data will expire in 10 seconds)

Data from the cache:

object(stdClass)#3 (2) { ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) }


2.Memcache面向对象的常用接口


Memcache客户端包含两组接口,一组是面向过程的接口,一组是面向对象的接口,具体可以参考PHP手册 “LXXV. Memcache Functions” 这章(http://php.net/manual/zh/book.memcache.php  )。


Memcache::add — 添加一个值,如果已经存在,则返回false

Memcache::addServer — 添加一个可供使用的服务器地址

Memcache::close — 关闭一个Memcache对象

Memcache::connect — 创建一个Memcache对象

memcache_debug — 控制调试功能

Memcache::decrement — 对保存的某个key中的值进行减法操作

Memcache::delete — 删除一个key值

Memcache::flush — 清除所有缓存的数据

Memcache::get — 获取一个key值

Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计

Memcache::getServerStatus — 获取运行服务器的参数

Memcache::getStats — 返回服务器的一些运行统计信息

Memcache::getVersion — 返回运行的Memcache的版本信息

Memcache::increment — 对保存的某个key中的值进行加法操作

Memcache::pconnect — 创建一个Memcache的持久连接对象

Memcache::replace — R对一个已有的key进行覆写操作

Memcache::set — 添加一个值,如果已经存在,则覆写

Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩

Memcache::setServerParams — 在运行时修改服务器的参数


3.测试代码分析


现在我们开始一段测试代码:

<?php
//连接
$mem = new Memcache;
$mem->connect("192.168.0.200", 12000);

//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br>";

//替换数据
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";

//保存数组
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";

//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";

//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";

//关闭连接
$mem->close();
?>

如果正常的话,浏览器将输出:

Get key1 value: This is first value

Get key1 value: This is replace value

Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd ) 

Get key1 value: 

Get key2 value:


基本说明我们的Memcache安装成功,我们再来分析以下上面的这段程序。


初始化一个Memcache的对象:

$mem = new Memcache;


连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:

$mem->connect("192.168.0.200", 12000);


保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:

$mem->set('key1', 'This is first value', 0, 60);


从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:

$val = $mem->get('key1');

echo "Get key1 value: " . $val;


现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:

$mem->replace('key1', 'This is replace value', 0, 60);

$val = $mem->get('key1');

echo "Get key1 value: " . $val;


同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出

$arr = array('aaa', 'bbb', 'ccc', 'ddd');

$mem->set('key2', $arr, 0, 60);

$val2 = $mem->get('key2');

print_r($val2);


现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果

$mem->delete('key1');

$val = $mem->get('key1');

echo "Get key1 value: " . $val . "<br>";


最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接

$mem->flush();

$val2 = $mem->get('key2');

echo "Get key2 value: ";

print_r($val2);

echo "<br>";


阅读本文下:php进阶--memcache技术应用详解(下) 

Memcache安装包下载:https://pan.baidu.com/s/1oHyYkV2sIDA1KfNK9oPMjg   提取码:bmuq 


参考网址:

http://www.runoob.com/memcached/memcached-tutorial.html 

http://php.net/manual/zh/book.memcache.php 

https://www.cnblogs.com/lizucq/p/5948784.html 

https://blog.csdn.net/hanjianqiang2468/article/details/52606379

https://www.cnblogs.com/yjken/articles/3927503.html


转载请注明: ITTXX.CN--分享互联网 » php进阶(三)--memcache技术应用详解(上)

最后更新:2019-03-21 16:43:55

赞 (3) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽