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

文摘  PHP memcache和memcached区别分析

PHP工具扩展 本站 1124 0评论

一、Memcache是什么?


Memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。这是一套开放源代码软件,以BSD license授权发布。


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

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

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


Memcache官方网站:http://memcached.org/ 


MemCache的工作流程如下:

1、先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;

2、如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);

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

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


二、Memcached又是什么?


Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d可以理解为daemon),以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据。


关于Memcached就不用多说了,就是a distributed memory object  caching system 。既然是一个用来存东西的系统,那么一定要有个存放的地方吧,我们就叫它服务器端吧,然后谁把东西存放在上面就叫它客户端吧,那怎么放呢,肯定是 客户端 -- 连接服务器端 -- 把东西发送给服务器端 -- 实现了东西的存放么,要去取的时候也是一样的,先连接,在取东西回来了。所有就有了memcached的服务器端,安装请见 https://ittxx.cn/view/284  这个是WIN下的,*unix下的请到 http://memcached.org/ 去下载然后编译安装了,这里我就不多说安装的配置了,网上已经有很多了。


安装完成后看下自己的进程里面memcached的服务是否在跑着的? 好了进程在跑着呢,那就看看客户端吧

000.jpg


三、Memcache和Memcached区别


· Memcache和Memcached 其实是一个东西,只是php中要是用的扩展不一样;

· windows下只能安装php_memcache.dll 扩展并不存在 php_memcached.dll, 所以windows 中只能使用$mcd = new Memcache() 不能使用new Memcached();

· memcached的1.2.4及以上增加了CAS(Check and Set)协议,对于同一key的多进行程的并发处理问题。但php的扩展memcache,不支持cas,所以我们要装memcached扩展,memcached扩展是基于libmemcached,所以要先安装libmemcached。

· php中的memcache扩展与memcached扩展相对比,memcache扩展已经停止了维护且功能相对较少;而memcached扩展一直有维护更新,功能强大。


我们这里所说的 memcache 和 memcached 说的是PHP的扩展,假如我们要在PHP中使用 memcache ,我们肯定是先在服务器上安装 memcache 服务,然后为PHP安装对应的扩展,这样我们才能用PHP代码控制 memcache,那么安装完之后我们 echo phpinfo(); 会发现:

111.jpg


这里我们要讨论的就是图片上显示的 memcache 和 memcached:


1、memcache最早是在2004年2月开发的,最后更新是在2013年4月,而 memcached 最早是在2009年1月开发的,最后更新是在2014年1月更新的。因此 memcache的历史 比 memcached 早。更多信息大家可以参考:

memcachehttp://pecl.php.net/package/memcache    

memcachedhttp://pecl.php.net/package/memcached 


2、 memcache 是一个原生版本,完全是在 PHP 框架内开发的,支持 OO(面向对象) 和非 OO 两套接口并存,而 memcached 是建立在 libmemcached 的基础上的,只支持 OO 接口。这就意味着在安装 memcache 扩展的时候不要求安装其他的东西,但是在安装 memcached 的时候会要求你安装 libmemcached。别嫌麻烦!因为 libmemcached 是 memcache 的 C 客户端,它具有低内存,线程安全等优点。据说新浪微博之前就全面将 PHP 的 memcache 替换成 PHP 的 memcached,在高并发下,稳定性果断提高。


3、memcached 有个比较 nice 的地方,就是 flag 不是在操作的时候设置的,而是有一个统一的 setOption() 函数进行设置,我们可以举添加缓存数据为例子:

#memcache:

bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )

#memcached:

public bool Memcached::add ( string $key , mixed $value [, int $expiration ] )

从上面各自的 add 方法可以看到,memcache 的 add 方法中的第三个参数代表是否对数据进行压缩,这样假如说我的缓存需要设置过期时间,但是 flag 参数在前面,我就得每一次都对 flag 进行设置! 

而 memcached 中是使用 setOption() 来进行统一设置的(默认开启压缩)。


4、memcached memcache 支持更多的 memcache 协议,大概也就是说 memcached 有更多的方法,比如 getMulti() 和 setMulti() 函数非常有用,但是 memcache 并不支持。 

更多的方法大家可以看PHP的官方手册: 

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

memcachedhttp://php.net/manual/zh/book.memcached.php 


5、差别比较大的一点是,memcached 支持 Binary Protocol,而 memcache 不支持,这意味着 memcached 会有更高的性能。但是网上很多博客说 memcached 不支持长连接,这其实不然,大家看官方手册:http://php.net/manual/zh/memcached.construct.php 

333.jpg上面明确的提出,当使用长链接的时候。。。因此 memcached是能够实现长连接的。


6、比较尴尬的一点是 memcached 和 memcache 对应的服务端名字都是 memcached,大家使用 ps aux | grep memcache 就会发现守护进程的名字是 memcached(我的环境是 ubuntu),其实后面的 d 可以理解为守护进程,因此网上有的人说 memcache 是客户端, memcached 是服务端就是这个意思,同学们不要将客户端的 memcached 和服务端的 memcached 混淆了就好。


7、两者在实现某些相同功能时所使用的算法也是有一定差异的,由于内容比较深,我也不太懂。。。。。


四、Memcache客户端(php)


php memcache独立用php实现,是老客户端,从我们实践中已发现有多个问题,而且功能少,属性也可设置的少;

http://pecl.php.net/package/memcache 


php memcached是基于原生的c的libmemcached的扩展,更加完善,建议替换为php memcached

http://pecl.php.net/package/memcached 


new memcache是pecl扩展库版本

new memcached是libmemcached版本


现在主要用的都是 Memcached的客户端扩展。


五、Memcached安装(服务端)


安装:

cd /root/lnmp/src/
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
tar xzf memcached-1.4.15.tar.gz
cd memcached-1.4.15
./configure --prefix=/usr/local/memcached
make && make install
ln -s /usr/local/memcached/bin/memcached /usr/bin/memcached
/bin/cp scripts/memcached.sysv /etc/init.d/memcached
sed -i 's@^USER=.*@USER=root@' /etc/init.d/memcached
sed -i 's@chown@#chown@' /etc/init.d/memcached
sed -i 's@/var/run/memcached/memcached.pid@/var/run/memcached.pid@' /etc/init.d/memcached
sed -i 's@^prog=.*@prog="/usr/local/memcached/bin/memcached"@' /etc/init.d/memcached #前面有软链接,这里可以省略
chmod +x /etc/init.d/memcached
chkconfig --add memcached
chkconfig memcached on
cd ..


启动memcached:

service memcached start  #或者执行下面
memcached -p 11211 -l 127.0.0.1 -d -u root -P /var/run/memcached.pid -m 64M -c 1024

几个参数的解释:

-p memcached监听的TCP端口

-l 监听的ip地址,127.0.0.1是本机,当然也可以写上你的服务器IP,如:10.0.0.10,这是我服务器的IP地址,如果你需要多个服务器都能够读取这台memcached的缓存数据,那么就必须设定这个ip

-d 以daemon方式运行,将程序放入后台

-u memcached的运行用户,我设定的是nobody

-P memcached的pid文件路径

-m memcached可以使用的最大内存数量

-c memcached同时可以接受的最大的连接数


如果你希望以socket方式来访问memcached,那么在启动的时候就必须去掉 -l和-p参数,并加上-s参数:

-s memcached的socket文件路径


六、php中memcache扩展组件的安装


tar xzf 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
cd ../

按照我的环境,编译出来的memcache.so自动生成在/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/ 目录下,如果你的环境不一样,你得根据自己情况修改你的php.ini了。


接着要做的工作就是让php加载这个扩展,编辑你的php.ini,在适当位置(通常是最后,也可以是独立的一个ini文件)加入如下行:

extension=memcache.so

然后重启php或者apache,运行一个phpinfo()来确认一下,正常的话你应该可以看到这个了:memcache


php-memcache的简单使用举例:

<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1','11211');
$memcache->setCompressThreshold(20000, 0.2); // 设置压缩   
echo $memcache->getVersion();// 输出memcached版本   
$test = array(1,2,3,4,5,'abcde');//生成一个数组   
if($memcache->get('test')){
        print_r($memcache->get('test'));//获取数据   
        echo "\n";
        echo 'cached';
        echo "\n";
}else{
        $memcache->set('test',$test,0,30);//写入数据   
        echo 'no cache';
        echo "\n";
}
?>


七、php中memcached扩展组件的安装


最新版ibmemcached-1.0.17.tar.gz可能会报错error: ‘HAVE_MEMCACHED_BINARY’ was not declared in this scope

用libmemcached-1.0.16.tar.gz没问题


安装如下:

wget https://launchpad.net/libmemcached/1.0/1.0.16/+download/libmemcached-1.0.16.tar.gz
wget http://pecl.php.net/get/memcached-2.1.0.tgz
tar xzf libmemcached-1.0.16.tar.gz
cd libmemcached-1.0.16
./configure --with-memcached=/usr/local/memcached
make && make install
cd ..
tar xzf memcached-2.1.0.tgz
cd memcached-2.1.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

按照我的环境,编译出来的memcached.so自动生成在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/ 目录下,如果你的环境不一样,你得根据自己情况修改你的php.ini了。


接着要做的工作就是让php加载这个扩展,编辑你的php.ini,在适当位置(通常是最后,也可以是独立的一个ini文件)加入如下行:

extension=memcached.so

然后重启php或者apache,运行一个phpinfo()来确认一下,正常的话你应该可以看到这个了:memcached


服务器端和客户端都弄好了看看示例代码可以跑起来的么,如图:

444.jpg

结果如图:

555.jpg

都跑起来了,看看memcache和memcached的使用的区别,那就好好的翻看下PHP手册吧,其实手册是最好的东西了


八、Memcached优缺点:


优点:

1.读写性能优异,特别是高并发时和文件缓存比有明显优势;

2.memcached组建支持集群,并且是自动管理负载均衡;

3.开源,占用资源小,协议简单的软件,实现了数据库和web之间的数据缓存功能,减少数据库的检索次数,减少数据库的I/O,解决了架构数据库端的压力;

4.存储方式:内置于内存存储方式,存取的效率高,执行的速度快;


缺点:

1.缓存空间有限:据说一台电脑的mem缓存开到2g以上会出现不稳定,数据无故丢失的现象;

2.掉电丢失数据:由于是把数据放在内存里的,所有一旦机器掉电,数据也就全部丢失了。

一般建议:而mem则适合放一些频繁更改的数据,比如可以把session数据放进mem;


九、总结


· 其实很简单,memcache是php的一个扩展,用于php管理memcached(服务端),php-memcache.dll。

· 如果安装了memcached(服务端)不安装扩展,那么php无法操控memcached,但是命令行使用起来没有问题

· 如果安装了PHP memcache客户端(php memcache和php memcached)。但是没有安装memcached(服务端)服务,那么这个就无法使用

· 只有同时安装了memcached(服务端)和PHP memcache客户端扩展才可以提高动态网站性能

· memcached 比 memcache 好,因此在以后的开发过程中,大家尽量使用 memcached


参考网址:

https://blog.csdn.net/kyp82ndlf/article/details/79691276 

https://blog.csdn.net/hong2511/article/details/81154195

https://blog.csdn.net/baidu_30000217/article/details/53586536

https://blog.csdn.net/u012129607/article/details/77746268


转载请注明: ITTXX.CN--分享互联网 » PHP memcache和memcached区别分析

最后更新:2019-03-21 17:05:20

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

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