一、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的服务是否在跑着的? 好了进程在跑着呢,那就看看客户端吧
三、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(); 会发现:
这里我们要讨论的就是图片上显示的 memcache 和 memcached:
1、memcache最早是在2004年2月开发的,最后更新是在2013年4月,而 memcached 最早是在2009年1月开发的,最后更新是在2014年1月更新的。因此 memcache的历史 比 memcached 早。更多信息大家可以参考:
memcache:http://pecl.php.net/package/memcache
memcached:http://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的官方手册:
memcache: http://php.net/manual/zh/book.memcache.php
memcached: http://php.net/manual/zh/book.memcached.php
5、差别比较大的一点是,memcached 支持 Binary Protocol,而 memcache 不支持,这意味着 memcached 会有更高的性能。但是网上很多博客说 memcached 不支持长连接,这其实不然,大家看官方手册:http://php.net/manual/zh/memcached.construct.php
上面明确的提出,当使用长链接的时候。。。因此 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
服务器端和客户端都弄好了看看示例代码可以跑起来的么,如图:
结果如图:
都跑起来了,看看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